#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.