-
Couldn't load subscription status.
- Fork 8
Description
Hello,
I am trying to create an apptainer image for pyAFQ #103 to work on gpus using the following config .def file:
Bootstrap: docker
From: nvidia/cuda:12.1.0-devel-ubuntu22.04
%environment
export DEBIAN_FRONTEND=noninteractive
export PATH=/opt/anaconda/envs/afq/bin:/opt/anaconda/bin:${PATH}
export LD_LIBRARY_PATH=/opt/anaconda/lib:${LD_LIBRARY_PATH}
export PYTHONPATH=/opt/anaconda/envs/afq/lib/python3.11/site-packages:${PYTHONPATH}
%post
# System update and basic tools installation
apt-get update && apt-get install --assume-yes apt-transport-https \
ca-certificates gnupg software-properties-common \
gcc git wget curl numactl cmake
# Miniconda3
curl -L "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-1-Linux-x86_64.sh" \
-o "/tmp/Miniconda3.sh"
bash /tmp/Miniconda3.sh -b -p /opt/anaconda
rm -rf /tmp/Miniconda3.sh
cd /opt && eval "$(/opt/anaconda/bin/conda shell.bash hook)"
# Create writable conda env for AFQ + niimath
/opt/anaconda/bin/conda create -y -n afq python=3.11
# Use the env’s python for installs
/opt/anaconda/envs/afq/bin/pip install numpy>=2.0.0 scipy>=1.13.0 cython nibabel dipy tqdm fslpy
/opt/anaconda/envs/afq/bin/pip install git+https://github.com/dipy/GPUStreamlines.git
/opt/anaconda/envs/afq/bin/pip install git+https://github.com/36000/pyAFQ.git@dam
#Address read only to executable permissions
chmod +x /opt/anaconda/envs/afq/lib/python3.11/site-packages/niimath/bin/niimath || true
ln -sf /opt/anaconda/envs/afq/lib/python3.11/site-packages/niimath/bin/niimath /usr/local/bin/niimath || true
# Sanity check (Brainchop's niimath should now work in env)
/opt/anaconda/envs/afq/bin/niimath --help || true
%runscript
exec /opt/anaconda/envs/afq/bin/python "$@"
I also tried adding:
chmod -R a+rX /opt/anaconda
chmod a+rx /usr/local/bin/niimath
chmod a+rx /opt/anaconda/envs/afq/lib/python3.11/site-packages/niimath/bin/niimath
At the end of the %post section.
The error I get is:
INFO:AFQ:No stop mask given, using ACT and 3T prob maps esimated from T1w INFO:AFQ:Calculating _desc-bundles_tractography INFO:AFQ:Calculating _desc-T1w_mask.nii.gz ERROR:AFQ:Command failed: ['niimath', '/tmp/tmp5m0g1i1o/t1.nii.gz', '-conform', '-gz', '0', '-', '-odt', 'char'] ERROR:AFQ:Return code: 1 ERROR:AFQ:STDERR: Traceback (most recent call last): File "/opt/anaconda/envs/afq/bin/niimath", line 3, in <module> from niimath import main File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/niimath/__init__.py", line 38, in <module> os.chmod(bin, os.stat(bin).st_mode | 0o111) OSError: [Errno 30] Read-only file system: '/opt/anaconda/envs/afq/lib/python3.11/site-packages/niimath/bin/niimath' Traceback (most recent call last): File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 143, in __call__ val = part() ^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/immlib/workflow/_core.py", line 884, in <lambda> lazy(lambda c,args: f(inputtup, calctup, c, args), c, args) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/immlib/workflow/_core.py", line 873, in _call_calc r = c.eager_call(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/immlib/workflow/_core.py", line 448, in eager_call res = self.function(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/AFQ/tasks/decorators.py", line 84, in wrapper_as_file gen, meta = func( ^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/AFQ/tasks/data.py", line 1426, in t1_brain_mask return run_brainchop(nib.load(t1_file), "mindgrab"), dict( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/AFQ/nn/brainchop.py", line 68, in run_brainchop volume, header = _run_brainchop_command(conform, [tmp_t1_file]) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/AFQ/nn/brainchop.py", line 36, in _run_brainchop_command return func(*args) ^^^^^^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/brainchop/niimath/__init__.py", line 273, in conform res = subprocess.run(cmd, capture_output=True, check=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/subprocess.py", line 571, in run raise CalledProcessError(retcode, process.args, subprocess.CalledProcessError: Command '['niimath', '/tmp/tmp5m0g1i1o/t1.nii.gz', '-conform', '-gz', '0', '-', '-odt', 'char']' returned non-zero exit status 1. During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 143, in __call__ val = part() ^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/immlib/workflow/_core.py", line 884, in <lambda> lazy(lambda c,args: f(inputtup, calctup, c, args), c, args) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/immlib/workflow/_core.py", line 868, in _call_calc for (p,arg) in zip(c.signature.parameters.values(), argvals): File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/immlib/workflow/_core.py", line 855, in _source_lookup val = lazycalc()[oidx] ^^^^^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 152, in __call__ raise init_error File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 121, in __new__ raise LazyError((fn, args, kw)) pcollections._lazy.LazyError: lazy raised error during call to <lambda>(<immlib.calc object at 0x1555009b85c0>, (6, 7, 8, 9)) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 143, in __call__ val = part() ^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/immlib/workflow/_core.py", line 884, in <lambda> lazy(lambda c,args: f(inputtup, calctup, c, args), c, args) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/immlib/workflow/_core.py", line 868, in _call_calc for (p,arg) in zip(c.signature.parameters.values(), argvals): File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/immlib/workflow/_core.py", line 855, in _source_lookup val = lazycalc()[oidx] ^^^^^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 152, in __call__ raise init_error File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 121, in __new__ raise LazyError((fn, args, kw)) pcollections._lazy.LazyError: lazy raised error during call to <lambda>(<immlib.calc object at 0x1555009b8b40>, (6, 7, 8, (0, 0), (3, 0))) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 143, in __call__ val = part() ^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/immlib/workflow/_core.py", line 855, in _source_lookup val = lazycalc()[oidx] ^^^^^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 152, in __call__ raise init_error File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 121, in __new__ raise LazyError((fn, args, kw)) pcollections._lazy.LazyError: lazy raised error during call to <lambda>(<immlib.calc object at 0x15550096a4c0>, (6, 7, 8, (1, 3), (1, 2), (6, 0), (1, 1), (1, 0), 24, 25, 26, 27, 28)) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 143, in __call__ val = part() ^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/immlib/workflow/_core.py", line 884, in <lambda> lazy(lambda c,args: f(inputtup, calctup, c, args), c, args) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/immlib/workflow/_core.py", line 873, in _call_calc r = c.eager_call(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/immlib/workflow/_core.py", line 448, in eager_call res = self.function(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/AFQ/tasks/tractography.py", line 309, in fiber_odf params_file = data_imap[f"{odf_model.lower()}_params"] ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 381, in __getitem__ v = v() ^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 152, in __call__ raise init_error File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 121, in __new__ raise LazyError((fn, args, kw)) pcollections._lazy.LazyError: lazy raised error during call to _source_lookup((lazy(<23454799358480>: ready), lazy(<23454799358192>: ready), lazy(<23454799790816>: ready), lazy(<23454799799648>: ready), lazy(<23454799800320>: ready), lazy(<23454799799552>: ready), lazy(<23454799798016>: ready), lazy(<23454799799360>: ready), lazy(<23454799799792>: ready), lazy(<23454799795904>: ready), lazy(<23454799800176>: waiting), lazy(<23454799801040>: waiting), lazy(<23454799801376>: waiting), lazy(<23454799801568>: waiting), lazy(<23454799801664>: waiting), lazy(<23454799801808>: waiting), lazy(<23454799801184>: waiting), lazy(<23454799802144>: waiting), lazy(<23454799800560>: waiting), lazy(<23454799791968>: waiting), lazy(<23454799802288>: waiting), lazy(<23454799802480>: waiting), lazy(<23454799802672>: waiting), lazy(<23454799802864>: waiting), lazy(<23454799803056>: waiting), lazy(<23454799803248>: waiting), lazy(<23454799803440>: waiting), lazy(<23454799803632>: waiting), lazy(<23454799803824>: waiting), lazy(<23454799804016>: ready), lazy(<23454799804208>: ready), lazy(<23454799804400>: ready)), (lazy(<23454799804688>: waiting), lazy(<23454799804784>: ready), lazy(<23454799804880>: waiting), lazy(<23454799804976>: ready), lazy(<23454799805072>: waiting), lazy(<23454799805168>: waiting), lazy(<23454799805264>: waiting), lazy(<23454799805360>: waiting), lazy(<23454799805456>: waiting), lazy(<23454799805552>: waiting), lazy(<23454799805648>: waiting), lazy(<23454799805744>: waiting), lazy(<23454799805840>: waiting), lazy(<23454799805936>: waiting), lazy(<23454799806032>: waiting), lazy(<23454799806128>: waiting), lazy(<23454799806224>: waiting), lazy(<23454799806320>: waiting), lazy(<23454799806416>: waiting), lazy(<23454798626928>: waiting), lazy(<23454798627024>: waiting), lazy(<23454798627120>: waiting), lazy(<23454798627216>: waiting), lazy(<23454798627312>: waiting), lazy(<23454798627408>: waiting), lazy(<23454798627504>: waiting), lazy(<23454798627600>: waiting), lazy(<23454798627696>: waiting), lazy(<23454798627792>: waiting), lazy(<23454798627888>: waiting), lazy(<23454798627984>: waiting), lazy(<23454798628080>: waiting), lazy(<23454798628176>: waiting), lazy(<23454798628272>: waiting), lazy(<23454798628368>: waiting), lazy(<23454798628464>: waiting), lazy(<23454798628560>: waiting), lazy(<23454798628656>: waiting), lazy(<23454798628752>: waiting), lazy(<23454798628848>: waiting), lazy(<23454798628944>: waiting), lazy(<23454798629040>: waiting), lazy(<23454798629136>: waiting), lazy(<23454798629232>: waiting), lazy(<23454798629328>: waiting), lazy(<23454798629424>: waiting), lazy(<23454798629520>: waiting), lazy(<23454798629616>: waiting), lazy(<23454798629712>: waiting), lazy(<23454798629808>: waiting), lazy(<23454798629904>: waiting), lazy(<23454798630000>: waiting), lazy(<23454798630096>: waiting), lazy(<23454798630192>: waiting), lazy(<23454798630288>: waiting), lazy(<23454798630384>: waiting), lazy(<23454798630480>: waiting), lazy(<23454798630576>: waiting), lazy(<23454798630672>: waiting), lazy(<23454798630768>: waiting), lazy(<23454798630864>: waiting), lazy(<23454798630960>: waiting), lazy(<23454798631056>: waiting), lazy(<23454798631152>: waiting), lazy(<23454798631248>: waiting), lazy(<23454798631344>: waiting), lazy(<23454798631440>: waiting), lazy(<23454798631536>: waiting), lazy(<23454798631632>: ready), lazy(<23454798631728>: waiting), lazy(<23454798631824>: waiting), lazy(<23454798631920>: waiting)), (21, 0)) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 143, in __call__ val = part() ^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/immlib/workflow/_core.py", line 884, in <lambda> lazy(lambda c,args: f(inputtup, calctup, c, args), c, args) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/immlib/workflow/_core.py", line 868, in _call_calc for (p,arg) in zip(c.signature.parameters.values(), argvals): File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/immlib/workflow/_core.py", line 855, in _source_lookup val = lazycalc()[oidx] ^^^^^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 152, in __call__ raise init_error File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 121, in __new__ raise LazyError((fn, args, kw)) pcollections._lazy.LazyError: lazy raised error during call to <lambda>(<immlib.calc object at 0x1554ff62b7c0>, (4, 2)) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 143, in __call__ val = part() ^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/immlib/workflow/_core.py", line 855, in _source_lookup val = lazycalc()[oidx] ^^^^^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 152, in __call__ raise init_error File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 121, in __new__ raise LazyError((fn, args, kw)) pcollections._lazy.LazyError: lazy raised error during call to <lambda>(<immlib.calc object at 0x1554ff62bc40>, (0, 1, 4, 2, (7, 0), (1, 0), (5, 0), 6, 7)) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 143, in __call__ val = part() ^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/immlib/workflow/_core.py", line 884, in <lambda> lazy(lambda c,args: f(inputtup, calctup, c, args), c, args) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/immlib/workflow/_core.py", line 873, in _call_calc r = c.eager_call(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/immlib/workflow/_core.py", line 448, in eager_call res = self.function(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/AFQ/tasks/decorators.py", line 84, in wrapper_as_file gen, meta = func( ^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/AFQ/tasks/segmentation.py", line 64, in segment streamlines = tractography_imap["streamlines"] ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 381, in __getitem__ v = v() ^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 152, in __call__ raise init_error File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 121, in __new__ raise LazyError((fn, args, kw)) pcollections._lazy.LazyError: lazy raised error during call to _source_lookup((lazy(<23454796711776>: ready), lazy(<23454796711824>: ready), lazy(<23454796712016>: ready), lazy(<23454796712208>: waiting), lazy(<23454796712400>: ready), lazy(<23454796712592>: waiting), lazy(<23454796712784>: waiting), lazy(<23454796712976>: waiting)), (lazy(<23454796713264>: waiting), lazy(<23454796713360>: waiting), lazy(<23454796713456>: waiting), lazy(<23454796713552>: waiting), lazy(<23454796713648>: waiting), lazy(<23454796713744>: waiting), lazy(<23454796713840>: waiting), lazy(<23454796713936>: waiting), lazy(<23454796714032>: waiting)), (8, 0)) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 143, in __call__ val = part() ^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/immlib/workflow/_core.py", line 884, in <lambda> lazy(lambda c,args: f(inputtup, calctup, c, args), c, args) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/immlib/workflow/_core.py", line 868, in _call_calc for (p,arg) in zip(c.signature.parameters.values(), argvals): File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/immlib/workflow/_core.py", line 855, in _source_lookup val = lazycalc()[oidx] ^^^^^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 152, in __call__ raise init_error File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 121, in __new__ raise LazyError((fn, args, kw)) pcollections._lazy.LazyError: lazy raised error during call to <lambda>(<immlib.calc object at 0x1554ff628640>, (3, 4, 5, 0, 1, 7, 8)) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 143, in __call__ val = part() ^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/immlib/workflow/_core.py", line 855, in _source_lookup val = lazycalc()[oidx] ^^^^^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 152, in __call__ raise init_error File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 121, in __new__ raise LazyError((fn, args, kw)) pcollections._lazy.LazyError: lazy raised error during call to <lambda>(<immlib.calc object at 0x1554ff628440>, (3, 4, (0, 0), 5)) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/storage/home/hcoda1/0/ldaumail3/scratch/afq_ampb/code/9_participant_pyAFQ_gpu_gmwmi.py", line 86, in <module> main( File "/storage/home/hcoda1/0/ldaumail3/scratch/afq_ampb/code/9_participant_pyAFQ_gpu_gmwmi.py", line 74, in main myafq.export_all(xforms = False) File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/AFQ/api/participant.py", line 244, in export_all export_all_helper(self, xforms, indiv, viz) File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/AFQ/api/utils.py", line 148, in export_all_helper api_afq_object.export("indiv_bundles") File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/AFQ/api/participant.py", line 194, in export return self.plans_dict[section][attr_name] ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 381, in __getitem__ v = v() ^^^ File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 152, in __call__ raise init_error File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 121, in __new__ raise LazyError((fn, args, kw)) pcollections._lazy.LazyError: lazy raised error during call to _source_lookup((lazy(<23454796715376>: ready), lazy(<23454796715424>: ready), lazy(<23454796715616>: waiting), lazy(<23454796715808>: ready), lazy(<23454796716000>: ready), lazy(<23454796716192>: ready), lazy(<23454796716384>: waiting), lazy(<23454796716576>: ready), lazy(<23454796716768>: ready), lazy(<23454796716960>: waiting), lazy(<23454796717152>: waiting)), (lazy(<23454796717440>: waiting), lazy(<23454796717536>: waiting), lazy(<23454796717632>: waiting), lazy(<23454796717728>: waiting), lazy(<23454796717824>: waiting), lazy(<23454796717920>: waiting), lazy(<23454796718016>: waiting), lazy(<23454796718112>: waiting)), (5, 0))
I tried to use a Dockerfile instead and generate a Docker image before converting it into an apptainer image and ended up with the same errors. One last thing I did was to try and patch niimath so that the niimath scripts do not get edited during the process. I basically added this code to the configuration Dockerfile file:
# ===============================================================
# pyAFQ GPU Dockerfile (fixed niimath + read-only FS safe)
# ===============================================================
# Base image with CUDA 12.1 and Ubuntu 22.04
FROM nvidia/cuda:12.1.0-devel-ubuntu22.04
# Avoid interactive prompts
ENV DEBIAN_FRONTEND=noninteractive
# ---------------------------------------------------------------
# System dependencies
# ---------------------------------------------------------------
RUN apt-get update && apt-get install -y \
apt-transport-https ca-certificates gnupg software-properties-common \
gcc git wget curl numactl cmake && \
rm -rf /var/lib/apt/lists/*
# ---------------------------------------------------------------
# Install Miniconda
# ---------------------------------------------------------------
RUN curl -L "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-1-Linux-x86_64.sh" \
-o /tmp/miniconda.sh && \
bash /tmp/miniconda.sh -b -p /opt/anaconda && \
rm /tmp/miniconda.sh
# Add Conda to PATH
ENV PATH=/opt/anaconda/bin:$PATH
# ---------------------------------------------------------------
# Create and populate AFQ environment
# ---------------------------------------------------------------
RUN /opt/anaconda/bin/conda create -y -n afq python=3.11 && \
/opt/anaconda/envs/afq/bin/pip install \
numpy>=2.0.0 scipy>=1.13.0 cython nibabel dipy tqdm fslpy && \
/opt/anaconda/envs/afq/bin/pip install git+https://github.com/dipy/GPUStreamlines.git && \
/opt/anaconda/envs/afq/bin/pip install git+https://github.com/36000/pyAFQ.git@dam
# -------------------------------------------------------------------
# Patch niimath: remove chmod + indentation issues (Apptainer-safe)
# -------------------------------------------------------------------
RUN echo "🔧 Repairing niimath for Apptainer..." && \
FILE=/opt/anaconda/envs/afq/lib/python3.11/site-packages/niimath/__init__.py && \
# 1. Use awk to remove the entire block related to creating an executable,
# and also remove any os.chmod calls that might be left.
# This is less likely to break indentation than complex block deletion.
awk ' \
!/if os.path.isfile\(bin\):/ && \
!/os.chmod/ && \
!/try:/ && \
!/bin = os.path.join/ && \
!/with open\(bin, "w"\) as fd:/ && \
!/fd.write\(shbang\)/ && \
!/fd.write\(f"\s*from niimath import main\n"\)/ && \
!/fd.write\(f"\s*if __name__ == \x27__main__\x27:\n"\)/ && \
!/fd.write\(f"\s*main\(\)\n"\)/ \
{print} \
' $FILE > ${FILE}.fixed && mv ${FILE}.fixed $FILE && \
\
# 2. Create a clean launcher (as before)
echo '#!/bin/bash' > /usr/local/bin/niimath && \
echo 'exec /opt/anaconda/envs/afq/bin/python -m niimath "$@"' >> /usr/local/bin/niimath && \
chmod +x /usr/local/bin/niimath && \
echo "✅ niimath patched successfully" && \
/usr/local/bin/niimath --help || true
# ---------------------------------------------------------------
# Environment setup
# ---------------------------------------------------------------
ENV CONDA_DEFAULT_ENV=afq
ENV PATH=/opt/anaconda/envs/afq/bin:$PATH
ENV LD_LIBRARY_PATH=/opt/anaconda/lib:$LD_LIBRARY_PATH
# ---------------------------------------------------------------
# Default command (runs Python in AFQ env)
# ---------------------------------------------------------------
ENTRYPOINT ["/opt/anaconda/envs/afq/bin/python"]
Though I still end up with an indentation error:
INFO:AFQ:No stop mask given, using ACT and 3T prob maps esimated from T1w
INFO:AFQ:Calculating _desc-bundles_tractography
INFO:AFQ:Calculating _desc-T1w_mask.nii.gz
ERROR:AFQ:Command failed: ['niimath', '/tmp/tmpkqejk7v_/t1.nii.gz', '-conform', '-gz', '0', '-', '-odt', 'char']
ERROR:AFQ:Return code: 1
ERROR:AFQ:STDERR:
Traceback (most recent call last):
File "/opt/anaconda/envs/afq/bin/niimath", line 3, in <module>
from niimath import main
File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/niimath/__init__.py", line 5
from ._dist_ver import __version__
IndentationError: unexpected indent
Traceback (most recent call last):
File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/pcollections/_lazy.py", line 143, in __call__
val = part()
^^^^^^
File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/immlib/workflow/_core.py", line 884, in <lambda>
lazy(lambda c,args: f(inputtup, calctup, c, args), c, args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/immlib/workflow/_core.py", line 873, in _call_calc
r = c.eager_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/immlib/workflow/_core.py", line 448, in eager_call
res = self.function(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/AFQ/tasks/decorators.py", line 84, in wrapper_as_file
gen, meta = func(
^^^^^
File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/AFQ/tasks/data.py", line 1426, in t1_brain_mask
return run_brainchop(nib.load(t1_file), "mindgrab"), dict(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/AFQ/nn/brainchop.py", line 68, in run_brainchop
volume, header = _run_brainchop_command(conform, [tmp_t1_file])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/AFQ/nn/brainchop.py", line 36, in _run_brainchop_command
return func(*args)
^^^^^^^^^^^
File "/opt/anaconda/envs/afq/lib/python3.11/site-packages/brainchop/niimath/__init__.py", line 273, in conform
res = subprocess.run(cmd, capture_output=True, check=True)
... etc
Any idea what is causing so much trouble with niimath?
Thanks for your time and help!
Best,
-Loïc