Opened 5 years ago

Closed 5 years ago

Last modified 5 years ago

#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 pett, 5 years ago

Component: UnassignedPerformance
Owner: set to Tom Goddard
Platform: all
Project: ChimeraX
Status: newassigned
Summary: ChimeraX bug report submissiongeometry/graphics memory leak

comment:2 by Tom Goddard, 5 years ago

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.

comment:3 by Tristan Croll, 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.

in reply to:  4 ; comment:4 by goddard@…, 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.

in reply to:  5 ; comment:5 by Tristan Croll, 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 Tom Goddard, 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 Tom Goddard, 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 Tom Goddard, 5 years ago

Resolution: fixed
Status: assignedclosed

Believed fixed, but up to you to test since I don't have a test case for opengl leak.

in reply to:  9 ; comment:9 by Tristan Croll, 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 Tom Goddard, 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.

Note: See TracTickets for help on using tickets.