#3685 closed defect (fixed)
geometry/graphics memory leak
| Reported by: | Tristan Croll | Owned by: | Tom Goddard |
|---|---|---|---|
| Priority: | normal | Milestone: | |
| Component: | Performance | Version: | |
| Keywords: | Cc: | ||
| Blocked By: | Blocking: | ||
| Notify when closed: | Platform: | all | |
| Project: | ChimeraX |
Description
The following bug report has been submitted:
Platform: Linux-3.10.0-1127.19.1.el7.x86_64-x86_64-with-centos-7.8.2003-Core
ChimeraX Version: 1.1rc202008312018 (2020-08-31 20:18:51 UTC)
Description
Following on from #3684, I'm also seeing a slow memory leak (a few MB every few seconds) when scrolling around using Clipper's spotlight mode. According to `tracemalloc`, the culprits are:
/opt/UCSF/ChimeraX/lib/python3.7/site-packages/chimerax/geometry/place.py:767: size=43.1 MiB (+43.1 MiB), count=292 (+292), average=151 KiB
/opt/UCSF/ChimeraX/lib/python3.7/site-packages/chimerax/graphics/opengl.py:2599: size=13.7 MiB (+6992 KiB), count=135 (+94), average=104 KiB
The first corresponds to `_geometry.multiply_matrix_lists()`. The second: looks like the Numpy `astype` returns a new array with the same memory layout as the old. I think `numpy.require` may be your friend here.
Log:
UCSF ChimeraX version: 1.1rc202008312018 (2020-08-31)
© 2016-2020 Regents of the University of California. All rights reserved.
How to cite UCSF ChimeraX
> ui tool show Shell
/opt/UCSF/ChimeraX/lib/python3.7/site-packages/IPython/core/history.py:226:
UserWarning: IPython History requires SQLite, your history will not be saved
warn("IPython History requires SQLite, your history will not be saved")
> open 7jnu structureFactors true
Summary of feedback from opening 7jnu fetched from pdb
---
warning | WARNING: multiple experimental reflection datasets found:
F_meas_au, F_meas_sigma_au,
intensity_meas, intensity_sigma
Automatically choosing "F_meas_au, F_meas_sigma_au".
notes | Resolution: 2.3999931581295297
7jnu title:
New condition to crystallize Thermoanaerobacter ethanolicus Secondary alcohol
dehydrogenases I86A mutant with 2-pentanol and 3-methylcylohexanol [more
info...]
Chain information for 7jnu
---
Chain | Description
1.2/A 1.2/B 1.2/C 1.2/D | Secondary-alcohol dehydrogenase
Non-standard residues in 7jnu #1.2
---
2SL — (2S)-pentan-2-ol ((S)-2-pentanol)
NAP — nadp nicotinamide-adenine-dinucleotide phosphate
(2'-monophosphoadenosine 5'-diphosphoribose)
ZN — zinc ion
> close #1
Deleting Crystallographic maps (7jnu-sf.cif)
Deleting (LIVE) 2mFo-DFc
Deleting (LIVE) mFo-DFc
Deleting (LIVE) 2mFo-DFc_smooth_5
> open 7jnu
7jnu title:
New condition to crystallize Thermoanaerobacter ethanolicus Secondary alcohol
dehydrogenases I86A mutant with 2-pentanol and 3-methylcylohexanol [more
info...]
Chain information for 7jnu #1
---
Chain | Description
A B C D | Secondary-alcohol dehydrogenase
Non-standard residues in 7jnu #1
---
2SL — (2S)-pentan-2-ol ((S)-2-pentanol)
NAP — nadp nicotinamide-adenine-dinucleotide phosphate
(2'-monophosphoadenosine 5'-diphosphoribose)
ZN — zinc ion
> close #1
> open 7jnu structureFactors true
Summary of feedback from opening 7jnu fetched from pdb
---
warning | WARNING: multiple experimental reflection datasets found:
F_meas_au, F_meas_sigma_au,
intensity_meas, intensity_sigma
Automatically choosing "F_meas_au, F_meas_sigma_au".
notes | Resolution: 2.3999931581295297
7jnu title:
New condition to crystallize Thermoanaerobacter ethanolicus Secondary alcohol
dehydrogenases I86A mutant with 2-pentanol and 3-methylcylohexanol [more
info...]
Chain information for 7jnu
---
Chain | Description
1.2/A 1.2/B 1.2/C 1.2/D | Secondary-alcohol dehydrogenase
Non-standard residues in 7jnu #1.2
---
2SL — (2S)-pentan-2-ol ((S)-2-pentanol)
NAP — nadp nicotinamide-adenine-dinucleotide phosphate
(2'-monophosphoadenosine 5'-diphosphoribose)
ZN — zinc ion
OpenGL version: 3.3.0 NVIDIA 450.51.06
OpenGL renderer: TITAN Xp/PCIe/SSE2
OpenGL vendor: NVIDIA Corporation
Manufacturer: Dell Inc.
Model: Precision T5600
OS: CentOS Linux 7 Core
Architecture: 64bit ELF
CPU: 32 Intel(R) Xeon(R) CPU E5-2687W 0 @ 3.10GHz
Cache Size: 20480 KB
Memory:
total used free shared buff/cache available
Mem: 62G 7.1G 44G 229M 10G 54G
Swap: 4.9G 0B 4.9G
Graphics:
03:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP102 [TITAN Xp] [10de:1b02] (rev a1)
Subsystem: NVIDIA Corporation Device [10de:11df]
Kernel driver in use: nvidia
PyQt version: 5.12.3
Compiled Qt version: 5.12.4
Runtime Qt version: 5.12.9
Installed Packages:
alabaster: 0.7.12
appdirs: 1.4.4
Babel: 2.8.0
backcall: 0.2.0
blockdiag: 2.0.1
certifi: 2020.6.20
chardet: 3.0.4
ChimeraX-AddH: 2.1.1
ChimeraX-AlignmentAlgorithms: 2.0
ChimeraX-AlignmentHdrs: 3.2
ChimeraX-AlignmentMatrices: 2.0
ChimeraX-Alignments: 2.1
ChimeraX-Arrays: 1.0
ChimeraX-Atomic: 1.6.1
ChimeraX-AtomSearch: 2.0
ChimeraX-AxesPlanes: 2.0
ChimeraX-BasicActions: 1.1
ChimeraX-BILD: 1.0
ChimeraX-BlastProtein: 1.0.1
ChimeraX-BondRot: 2.0
ChimeraX-BugReporter: 1.0
ChimeraX-BuildStructure: 2.0
ChimeraX-Bumps: 1.0
ChimeraX-BundleBuilder: 1.0
ChimeraX-ButtonPanel: 1.0
ChimeraX-CageBuilder: 1.0
ChimeraX-CellPack: 1.0
ChimeraX-Centroids: 1.1
ChimeraX-ChemGroup: 2.0
ChimeraX-Clashes: 2.0
ChimeraX-Clipper: 0.15.0
ChimeraX-ColorActions: 1.0
ChimeraX-ColorGlobe: 1.0
ChimeraX-CommandLine: 1.1.3
ChimeraX-ConnectStructure: 2.0
ChimeraX-Contacts: 1.0
ChimeraX-Core: 1.1rc202008312018
ChimeraX-CoreFormats: 1.0
ChimeraX-coulombic: 1.0.1
ChimeraX-Crosslinks: 1.0
ChimeraX-Crystal: 1.0
ChimeraX-DataFormats: 1.0
ChimeraX-Dicom: 1.0
ChimeraX-DistMonitor: 1.1
ChimeraX-DistUI: 1.0
ChimeraX-Dssp: 2.0
ChimeraX-EMDB-SFF: 1.0
ChimeraX-ExperimentalCommands: 1.0
ChimeraX-FileHistory: 1.0
ChimeraX-FunctionKey: 1.0
ChimeraX-Geometry: 1.1
ChimeraX-gltf: 1.0
ChimeraX-Graphics: 1.0
ChimeraX-Hbonds: 2.0
ChimeraX-Help: 1.0
ChimeraX-HKCage: 1.0
ChimeraX-IHM: 1.0
ChimeraX-ImageFormats: 1.0
ChimeraX-IMOD: 1.0
ChimeraX-IO: 1.0
ChimeraX-ISOLDE: 1.0.2
ChimeraX-Label: 1.0
ChimeraX-LinuxSupport: 1.0
ChimeraX-ListInfo: 1.0
ChimeraX-Log: 1.1.1
ChimeraX-LookingGlass: 1.1
ChimeraX-Map: 1.0.1
ChimeraX-MapData: 2.0
ChimeraX-MapEraser: 1.0
ChimeraX-MapFilter: 2.0
ChimeraX-MapFit: 2.0
ChimeraX-MapSeries: 2.0
ChimeraX-Markers: 1.0
ChimeraX-Mask: 1.0
ChimeraX-MatchMaker: 1.1
ChimeraX-MDcrds: 2.0
ChimeraX-MedicalToolbar: 1.0.1
ChimeraX-Meeting: 1.0
ChimeraX-MLP: 1.0
ChimeraX-mmCIF: 2.2
ChimeraX-MMTF: 2.0
ChimeraX-Modeller: 1.0
ChimeraX-ModelPanel: 1.0
ChimeraX-ModelSeries: 1.0
ChimeraX-Mol2: 2.0
ChimeraX-Morph: 1.0
ChimeraX-MouseModes: 1.0
ChimeraX-Movie: 1.0
ChimeraX-Neuron: 1.0
ChimeraX-Nucleotides: 2.0
ChimeraX-OpenCommand: 1.2.1
ChimeraX-PDB: 2.1
ChimeraX-PDBBio: 1.0
ChimeraX-Phenix: 0.1
ChimeraX-PickBlobs: 1.0
ChimeraX-Positions: 1.0
ChimeraX-PresetMgr: 1.0
ChimeraX-PubChem: 2.0
ChimeraX-Read-Pbonds: 1.0
ChimeraX-Registration: 1.1
ChimeraX-RemoteControl: 1.0
ChimeraX-ResidueFit: 1.0
ChimeraX-RestServer: 1.0
ChimeraX-RNALayout: 1.0
ChimeraX-RotamerLibMgr: 2.0
ChimeraX-RotamerLibsDunbrack: 2.0
ChimeraX-RotamerLibsDynameomics: 2.0
ChimeraX-RotamerLibsRichardson: 2.0
ChimeraX-SaveCommand: 1.2
ChimeraX-SchemeMgr: 1.0
ChimeraX-SDF: 2.0
ChimeraX-Segger: 1.0
ChimeraX-Segment: 1.0
ChimeraX-SeqView: 2.2
ChimeraX-Shape: 1.0.1
ChimeraX-Shell: 1.0
ChimeraX-Shortcuts: 1.0
ChimeraX-ShowAttr: 1.0
ChimeraX-ShowSequences: 1.0
ChimeraX-SideView: 1.0
ChimeraX-Smiles: 2.0
ChimeraX-SmoothLines: 1.0
ChimeraX-SpaceNavigator: 1.0
ChimeraX-StdCommands: 1.0.4
ChimeraX-STL: 1.0
ChimeraX-Storm: 1.0
ChimeraX-Struts: 1.0
ChimeraX-Surface: 1.0
ChimeraX-SwapAA: 2.0
ChimeraX-SwapRes: 2.0
ChimeraX-TapeMeasure: 1.0
ChimeraX-Test: 1.0
ChimeraX-Toolbar: 1.0
ChimeraX-ToolshedUtils: 1.0
ChimeraX-Tug: 1.0
ChimeraX-UI: 1.2.3
ChimeraX-uniprot: 2.0
ChimeraX-ViewDockX: 1.0
ChimeraX-Vive: 1.1
ChimeraX-VolumeMenu: 1.0
ChimeraX-VTK: 1.0
ChimeraX-WavefrontOBJ: 1.0
ChimeraX-WebCam: 1.0
ChimeraX-WebServices: 1.0
ChimeraX-Zone: 1.0
colorama: 0.4.3
comtypes: 1.1.7
cxservices: 1.0
cycler: 0.10.0
Cython: 0.29.20
decorator: 4.4.2
distlib: 0.3.1
distro: 1.5.0
docutils: 0.16
filelock: 3.0.12
funcparserlib: 0.3.6
grako: 3.16.5
h5py: 2.10.0
html2text: 2020.1.16
idna: 2.10
ihm: 0.16
imagecodecs: 2020.5.30
imagecodecs-lite: 2020.1.31
imagesize: 1.2.0
ipykernel: 5.3.0
ipython: 7.15.0
ipython-genutils: 0.2.0
jedi: 0.17.2
Jinja2: 2.11.2
jupyter-client: 6.1.3
jupyter-core: 4.6.3
kiwisolver: 1.2.0
line-profiler: 2.1.2
lxml: 4.5.1
MarkupSafe: 1.1.1
matplotlib: 3.2.1
msgpack: 1.0.0
netifaces: 0.10.9
networkx: 2.4
numexpr: 2.7.1
numpy: 1.18.5
numpydoc: 1.0.0
openvr: 1.12.501
packaging: 20.4
parso: 0.7.1
pexpect: 4.8.0
pickleshare: 0.7.5
Pillow: 7.1.2
pip: 20.2.2
pkginfo: 1.5.0.1
prompt-toolkit: 3.0.7
psutil: 5.7.0
ptyprocess: 0.6.0
pycollada: 0.7.1
pydicom: 2.0.0
Pygments: 2.6.1
PyOpenGL: 3.1.5
PyOpenGL-accelerate: 3.1.5
pyparsing: 2.4.7
PyQt5-commercial: 5.12.3
PyQt5-sip: 4.19.19
PyQtWebEngine-commercial: 5.12.1
python-dateutil: 2.8.1
pytz: 2020.1
pyzmq: 19.0.2
qtconsole: 4.7.4
QtPy: 1.9.0
RandomWords: 0.3.0
requests: 2.24.0
scipy: 1.4.1
setuptools: 49.4.0
sfftk-rw: 0.6.6.dev0
six: 1.15.0
snowballstemmer: 2.0.0
sortedcontainers: 2.2.2
Sphinx: 3.1.1
sphinxcontrib-applehelp: 1.0.2
sphinxcontrib-blockdiag: 2.0.0
sphinxcontrib-devhelp: 1.0.2
sphinxcontrib-htmlhelp: 1.0.3
sphinxcontrib-jsmath: 1.0.1
sphinxcontrib-qthelp: 1.0.3
sphinxcontrib-serializinghtml: 1.1.4
suds-jurko: 0.6
tables: 3.6.1
tifffile: 2020.6.3
tinyarray: 1.2.2
tornado: 6.0.4
traitlets: 5.0.0
urllib3: 1.25.10
wcwidth: 0.2.5
webcolors: 1.11.1
wheel: 0.34.2
Change History (10)
comment:1 by , 5 years ago
| Component: | Unassigned → Performance |
|---|---|
| Owner: | set to |
| Platform: | → all |
| Project: | → ChimeraX |
| Status: | new → assigned |
| Summary: | ChimeraX bug report submission → geometry/graphics memory leak |
comment:2 by , 5 years ago
comment:3 by , 5 years ago
I don't think you're actually ensuring the array is always C contiguous:
import numpy arr = numpy.random.rand(10,3).T arr.data.c_contiguous False arr2 = arr.astype(numpy.float32) arr2.data.c_contiguous False arr3 = arr.astype(numpy.float64) arr3.data.c_contiguous False arr4 = numpy.require(arr, dtype=numpy.float64, requirements=['C_CONTIGUOUS'] arr4.data.c_contiguous True
Oh - and for a complete walk-through of using tracemalloc, look at #3684.
follow-up: 4 comment:4 by , 5 years ago
Aha! That is probably the opengl leak. Thanks! I have a vague recollection of looking at the numpy astype() order option documentation and thinking it would always give C order. But the default is order = 'K' which has a confusing explanation " ‘K’ means as close to the order the array elements appear in memory as possible". I guess that means keep the order of the original array but compact it if it is a subarray. I'd guess this is the clipper mesh vertices or triangles. Unfortunately having to reorder the arrays will slow down the mesh updates a small bit. I usually try to avoid that although it is probably pretty negligible in the overall render rate. Bur I am surprised that Clipper uses ordering typical of Fortran.
follow-up: 5 comment:5 by , 5 years ago
Clipper does use C-style arrays - but the data is indexed as ijk whereas ChimeraX volumes use kji. So what the Volume object sees as its data is actually a transposed view on the array Clipper actually fills. Can try rejigging things if it turns out to make a substantial performance difference.
comment:6 by , 5 years ago
Maybe fixed. You didn't give me a test case. I tried ISOLDE spotlight on both cryoEM and x-ray tutorials using tracemalloc compare_to() and could reporduce the place.py leak but not the opengl.py leak. I spent more time trying to reproduce your result then actually fixing the code, so please provide info in your bug reports about the exact test case (data set, steps) to reproduce the problem. I will leave it to you to test if my fix works for the opengl.py leak.
comment:7 by , 5 years ago
I would not expect any significant performance difference. Still not entirely clear how is resulting in an OpenGL buffer being filled with non-contiguous array -- the 3d map data does not go into an opengl buffer. Maybe you reverse the vertex x,y,z coordinates. Also it sounds like this should always cause the leak independent of data but I do not observe the leak panning in spotlight with the x-ray ISOLDE tutorial.
comment:8 by , 5 years ago
| Resolution: | → fixed |
|---|---|
| Status: | assigned → closed |
Believed fixed, but up to you to test since I don't have a test case for opengl leak.
follow-up: 9 comment:9 by , 5 years ago
Easiest test case: “isolde demo crystal_intro” ... then take a tracemalloc snapshot, pan around for a 20 seconds or so with the middle mouse button, then take a second snapshot and compare. Will have a try when the new build is ready.
comment:10 by , 5 years ago
Ok, that test case reproduces both memory leaks. I tested the OpenGL one and the fix resolves it. I'm going to put both these fixes in ChimeraX 1.1.
Good catch!
The multiply matrices memory leak was a reference counting bug in my C++ code that I just fixed.
The opengl memory leak is probably in PyOpenGL. As you can see a couple lines above the tracemalloc reported line my comment in opengl.py "# PyOpenGL 3.1.5 leaks memory if data not contiguous, PyOpenGL github issue #47." The line that is supposedly leaking is my call to make the numpy array contiguous so PyOpenGL does not leak memory. But your results suggests that PyOpenGL still leaks memory in this case. I'll have to look a bit more at this. That PyOpenGL memory leak used to be huge. So this leak you've identified seems to be a new one.