#author("2026-02-21T14:40:46+00:00;2026-01-11T11:49:09+00:00","default:sysosa","sysosa") #author("2026-02-21T14:42:37+00:00","default:sysosa","sysosa") 本家様 [[https://github.com/SBC-Utrecht/PyTom>+https://github.com/SBC-Utrecht/PyTom]] PyTom is a toolbox developed for interpreting cryo electron tomography data. All steps from reconstruction, localization, alignment and classification are covered with standard and improved methods. (DeepL先生訳) PyTomは低温電子トモグラフィデータを解釈するために開発されたツールボックスです。再構成、ローカライズ、アライメント、分類の全てのステップを標準的な手法と改良された手法でカバーしています。 他、テンプレートマッチングに特化した pytom-match-pick (本家様 [[https://github.com/SBC-Utrecht/pytom-match-pick>+https://github.com/SBC-Utrecht/pytom-match-pick]]) も扱います ***下準備 [#x7cc19a5] 実行環境はこんな感じです。nvidiaドライバのみ入っていてcudaライブラリは入ってないです. #code(nonumber){{ [root@rockylinux9 ~]# cat /etc/redhat-release Rocky Linux release 9.6 (Blue Onyx) [root@rockylinux9 ~]# cat /proc/driver/nvidia/version NVRM version: NVIDIA UNIX Open Kernel Module for x86_64 570.181 Release Build (dvs-builder@U22-I3-AF02-20-5) Wed Jul 30 18:41:07 UTC 2025 GCC version: gcc version 11.5.0 20240719 (Red Hat 11.5.0-5) (GCC) [root@rockylinux9 ~]# ls /usr/local/cuda ls: cannot access '/usr/local/cuda': No such file or directory [root@rockylinux9 ~]# }} まず、pyenv/anaconda で仮想実行環境を作れるようにします。 #code(nonumber){{ git clone https://github.com/yyuu/pyenv.git /apps/pyenv export PYENV_ROOT=/apps/pyenv export PATH=$PYENV_ROOT/bin:$PATH pyenv install --list <--これでanaconda,minicondaのバージョンが一覧されます. pyenv install miniforge3-25.3.1-0 source /apps/pyenv/versions/miniforge3-25.3.1-0/etc/profile.d/conda.sh conda update conda -y }} っで構築します。 ***PyTom [#e3546930] #code(nonumber){{ [root@rockylinux9 ~]# dnf install fftw-devel [root@rockylinux9 ~]# cd /apps/ [root@rockylinux9 apps]# git clone https://github.com/SBC-Utrecht/PyTom [root@rockylinux9 apps]# cd PyTom/ [root@rockylinux9 PyTom]# }} python 3.7とかでないとコンパイルできないようなので「environments/pytom_full.yaml」を修正します. cupyはv13.4以上でblackwell対応です. pytomのコードの仕様なのか最新のgcc(v14とかv15)ではコンパイルエラーになるみたい. #code(diff,nonumber){{ @@ -2,7 +2,7 @@ name: pytom_env channels: - conda-forge dependencies: -- python=3 +- python=3.12 - ipython - numpy<2 - lxml @@ -19,10 +19,10 @@ dependencies: - tqdm - mpi4py - joblib -- cupy +- cupy>=13.4 - matplotlib - scikit-image - swig - fftw[build=*openmpi*] - make -- gcc +- gcc<12 }} その上で #code(nonumber){{ [root@rockylinux9 PyTom]# conda env create -f environments/pytom_full.yaml --name pytom [root@rockylinux9 PyTom]# conda activate pytom (pytom) [root@rockylinux9 PyTom]# conda list : cuda-cccl_linux-64 13.1.78 ha770c72_0 conda-forge cuda-cudart-dev_linux-64 13.1.80 h376f20c_0 conda-forge cuda-cudart-static_linux-64 13.1.80 h376f20c_0 conda-forge cuda-cudart_linux-64 13.1.80 h376f20c_0 conda-forge cuda-nvrtc 13.1.80 hecca717_0 conda-forge cuda-version 13.1 h2ff5cdb_3 conda-forge cupy 13.6.0 py310hcc3e0c5_2 conda-forge cupy-core 13.6.0 py310h1d24f8f_2 conda-forge : gcc 11.4.0 h602e360_13 conda-forge gcc_impl_linux-64 11.4.0 h00c12a0_13 conda-forge gcc_linux-64 11.4.0 ha077dfb_4 conda-forge gfortran_impl_linux-64 11.4.0 hd465bd8_13 conda-forge gfortran_linux-64 11.4.0 hddf7001_4 conda-forge : mpi 1.0 openmpi conda-forge mpi4py 4.1.1 py310h42af892_102 conda-forge : numpy 1.26.4 py312heda63a1_0 conda-forge : openmpi 5.0.5 h6ae21d5_103 conda-forge openmpi-mpicc 5.0.5 hc43e4ee_103 conda-forge openmpi-mpicxx 5.0.5 hc10b7d8_103 conda-forge openmpi-mpifort 5.0.5 hede194e_103 conda-forge : python 3.12.12 hd63d673_1_cpython conda-forge : }} っで $CONDA_PREFIX の場所を確認して pytom を作ります #code(nonumber){{ (pytom) [root@rockylinux9 PyTom]# echo $CONDA_PREFIX /apps/pyenv/versions/miniforge3-25.3.1-0/envs/pytom (pytom) [root@rockylinux9 PyTom]# python setup.py install --prefix $CONDA_PREFIX : Searching : mpicc Found : True Searching : mpic++ Found : True Searching : libmpi.so Found : True Searching : mpi.h Found : True Searching : Python.h Found : True Searching : libpython3.12.so Found : True Searching : fftw3.h Found : True Searching : libfftw3.so Found : True Searching : type_traits.hpp Found : True Searching : ndarrayobject.h Found : False Searching : ndarrayobject.h Found : True Check compiling prerequisites: : (pytom) [root@rockylinux9 PyTom]# conda list : cuda-version 13.1 h2ff5cdb_3 conda-forge cupy 13.6.0 py312h045ee1a_2 conda-forge : gcc 11.4.0 h602e360_13 conda-forge : mpi 1.0 openmpi conda-forge mpi4py 4.1.1 py312hd140a38_102 conda-forge : numpy 1.26.4 py312heda63a1_0 conda-forge : pyqt 5.15.11 py312h82c0db2_2 conda-forge pyqt5-sip 12.17.0 py312h1289d80_2 conda-forge pyqtgraph 0.14.0 pyhd8ed1ab_0 conda-forge pyside6 6.9.2 py312h5654102_1 conda-forge python 3.12.12 hd63d673_1_cpython conda-forge python-dateutil 2.9.0.post0 pyhe01879c_2 conda-forge python_abi 3.12 8_cp312 conda-forge pytom 1.0 pypi_0 pypi : (pytom) [root@rockylinux9 PyTom]# conda deactivate [root@rockylinux9 PyTom]# }} 以上で完成です。 pytomGUI「/apps/PyTom/pytom/gui/pytomGUI.py」の最下行あたりに下記のような記載があります #code(nonumber){{ [root@rockylinux9 ~]# tail /apps/PyTom/pytom/gui/pytomGUI.py print(exctype, value, traceback) sys._excepthook(exctype, value, traceback) sys.exit(1) sys.excepthook = exception_hook for fname, module in [( 'motioncor2', 'motioncor2/1.2.1' ), ('header', 'imod/4.10.25')]: if subprocess.run(['which', fname], capture_output=True, text=True).returncode != 0: print('Please load the {} module'.format(module)) main() [root@rockylinux9 ~]# }} と motioncor2/1.2.1 をロードさせて motioncor2 の存在確認、imod/4.10.25 をロードして header の存在確認を行うようになってます。 ですが事前にmoduleコマンドで正しくMotionCor2やimodをロードしていればよろしいかと。ただMotionCor2は「motioncor2」として打てること. いつものEnvironmentModules こちらは「/apps/modulefiles/PyTom」として中身は下記のようにします。PyTomから imod や MotionCor2 を使うので予めロードさせておきます。 #code(nonumber){{ #%Module1.0 module load IMOD module load MotionCor2 set root /apps/pyenv/versions/miniforge3-25.3.1-0/envs/pytom prepend-path PATH $root/bin prepend-path LD_LIBRARY_PATH $root/lib }} 起動は #code(nonumber){{ [saber@rockylinux9 ~]$ module use /apps/modulefiles [saber@rockylinux9 ~]$ module load PyTom [saber@rockylinux9 ~]$ pytomGUI Please load the motioncor2/1.2.1 module Please load the imod/4.10.25 module }} となって下記画面が表示される &ref(2024y07m11d_192818881.png,nolink); ***pytom-match-pick [#w0b2e701] 本家様 [[https://github.com/SBC-Utrecht/pytom-match-pick>+https://github.com/SBC-Utrecht/pytom-match-pick]] pipy [[https://pypi.org/project/pytom-match-pick/>+https://pypi.org/project/pytom-match-pick/]] #code(nonumber){{ [root@rockylinux9 ~]# source /apps/pyenv/versions/miniforge3-25.3.1-0/etc/profile.d/conda.sh [root@rockylinux9 ~]# conda create -n pytom_tm -c conda-forge python=3.12 "cupy<14" cuda-version=12.8 [root@rockylinux9 ~]# conda activate pytom_tm (pytom_tm) [root@rockylinux9 ~]# python -m pip install pytom-match-pick[plotting] (pytom_tm) [root@rockylinux9 ~]# conda list : cuda-version 13.1 h2ff5cdb_3 conda-forge cupy 13.6.0 py312h045ee1a_2 conda-forge cupy-core 13.6.0 py312h1a70bb2_2 conda-forge cuda-cccl_linux-64 12.8.90 ha770c72_1 conda-forge cuda-cudart-dev_linux-64 12.8.90 h3f2d84a_1 conda-forge cuda-cudart-static_linux-64 12.8.90 h3f2d84a_1 conda-forge cuda-cudart_linux-64 12.8.90 h3f2d84a_1 conda-forge cuda-nvrtc 12.8.93 h5888daf_1 conda-forge cuda-version 12.8 h5d125a7_3 conda-forge cupy 13.6.0 py312h0317cef_2 conda-forge cupy-core 13.6.0 py312h16a6543_2 conda-forge : numpy 2.4.1 py312h33ff503_0 conda-forge numpy 2.4.2 py312h33ff503_1 conda-forge : python 3.12.12 hd63d673_1_cpython conda-forge python 3.12.12 hd63d673_2_cpython conda-forge python-dateutil 2.9.0.post0 pypi_0 pypi python_abi 3.12 8_cp312 conda-forge pytom-match-pick 0.12.1 pypi_0 pypi : (pytom_tm) [root@rockylinux9 ~]# (pytom_tm) [root@rockylinux9 ~]# python -c "import pytom_tm" (pytom_tm) [root@rockylinux9 ~]# python -c "import cupy as cp; a = cp.zeros((100,100))" ->上記2つともエラーなしで動いたので cupy は問題ないかと }} EnvironmentModules 「/apps/modulefiles/pytom-match-pick」として #code(nonumber){{ #%Module1.0 set root /apps/pyenv/versions/miniforge3-25.3.1-0/envs/pytom_tm prepend-path PATH $root/bin }} チュートリアルの実行 [[https://github.com/SBC-Utrecht/pytom-match-pick/wiki/Tutorial>+https://github.com/SBC-Utrecht/pytom-match-pick/wiki/Tutorial]] まず [[https://doi.org/10.34894/TLGJCM>+https://doi.org/10.34894/TLGJCM]]からデータセットを取得します。40枚のファイルです。 ***pytom-match-pick (CentOS7で) [#o139ffa9] [[CentOS/repo]]で devtoolset-11 を組み込んでgcc-11を有効にさせます. #code(nonumber){{ [root@centos7 ~]# yum install centos-release-scl-rh [root@centos7 ~]# vi /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo (vault.centos.orgを参照させるように修正します) [root@centos7 ~]# yum install devtoolset-11 -y [root@centos7 ~]# source scl_source enable devtoolset-11 [root@centos7 ~]# gcc --version gcc (GCC) 11.2.1 20220127 (Red Hat 11.2.1-9) Copyright (C) 2021 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. [root@centos7 ~]# [root@centos7 ~]# source /apps/pyenv/versions/miniforge3-25.3.1-0/etc/profile.d/conda.sh [root@centos7 ~]# conda create -n pytom_tm -c conda-forge python=3.11 cupy cuda-version=11.8 [root@centos7 ~]# conda activate pytom_tm (pytom_tm) [root@centos7 ~]# conda install -c conda-forge pyarrow (pytom_tm) [root@centos7 ~]# python -m pip install pytom-match-pick[plotting] (pytom_tm) [root@centos7 ~]# conda list : cuda-version 11.8 h70ddcb2_3 conda-forge cudatoolkit 11.8.0 h4ba93d1_13 conda-forge cupy 13.6.0 py311he6248c7_2 conda-forge cupy-core 13.6.0 py311h7b40851_2 conda-forge : pyarrow 21.0.0 py311h38be061_1 conda-forge pyarrow-core 21.0.0 py311h342b5a4_1_cpu conda-forge pyparsing 3.2.5 pypi_0 pypi python 3.11.13 h9e4cc4f_0_cpython conda-forge python-dateutil 2.9.0.post0 pypi_0 pypi python_abi 3.11 8_cp311 conda-forge pytom-match-pick 0.12.0 pypi_0 pypi : (pytom_tm) [root@centos7 ~]# conda deactivate [root@centos7 ~]# }} conda で pyarrow を入れる必要あり。その後に pip で pytom-match-pick を入れる流れで. そうでないと pyarrow のビルドが始まるが、centos7ではそのコンパイル環境を作るだけで一苦労. テスト. #code(nonumber){{ git clone https://github.com/SBC-Utrecht/pytom-match-pick cd pytom-match-pick/tests python -m unittest discover }} ***メモ [#f699ab48] 計算系によってはGPUメモリーが足らないと言われる. 正しい方法かは不明だが、ユニファイドメモリーを使って回避できたけど... 下記のように追記します. #code(nonumber){{ vi /apps/pyenv/versions/miniforge3-23.11.0-0/envs/pytom_tm/lib/python3.12/site-packages/pytom_tm/matching.py : pool = cp.cuda.MemoryPool(cp.cuda.malloc_managed) cp.cuda.set_allocator(pool.malloc) : }}