在HPC上,我先测试一下
apptainer exec my_container bash -c "activate environment; python3 script.py"
效果很好。
如果我交互地使用终端,它也可以很好地工作,例如:
apptainer shell my_container
activate environment
mpiexec -n 5 python3 script.py
但是,如果我尝试使用
编写 slurm 脚本apptainer exec my_container bash -c "activate environment;mpiexec -n 5 python3 script.py"
我收到以下消息: [mpiexec@acn89] HYDU_create_process (lib/utils/launch.c:73): 文件 srun 上的 execvp 错误(没有这样的文件或目录)
非常感谢任何帮助。
我管理的 HPC 集群的一位用户最近向我提出了同样的错误,希望这仍然可以帮助您。
在我们的例子中,这里的主要问题是 apptainer 弄乱了二进制文件和库。如果您查看 apptainer exec 文档:
-e, --cleanenv clean environment before running container
此标志将清理容器上的环境,因此在我的 shell 中设置的大部分变量都不会被传递下去,包括一些指向 MPI 的路径与容器上运行的路径不同,这似乎是问题所在。这就是我得到的:
[renato@n05 ~]$ apptainer exec spyro-1_latest.sif bash
Apptainer> . /home/firedrake/firedrake/bin/activate
(firedrake) Apptainer> mpiexec -n 6 python3 -c 'print(1)'
[mpiexec@n05] HYDU_create_process (lib/utils/launch.c:73): execvp error on file srun (No such file or directory)
^C[mpiexec@n05] Sending Ctrl-C to processes as requested
[mpiexec@n05] Press Ctrl-C again to force abort
[mpiexec@n05] HYDU_sock_write (lib/utils/sock.c:250): write error (Bad file descriptor)
[mpiexec@n05] send_hdr_downstream (mpiexec/pmiserv_cb.c:28): sock write error
[mpiexec@n05] HYD_pmcd_pmiserv_send_signal (mpiexec/pmiserv_cb.c:218): unable to write data to proxy
[mpiexec@n05] ui_cmd_cb (mpiexec/pmiserv_pmci.c:61): unable to send signal downstream
[mpiexec@n05] HYDT_dmxu_poll_wait_for_event (lib/tools/demux/demux_poll.c:76): callback returned error status
[mpiexec@n05] HYD_pmci_wait_for_completion (mpiexec/pmiserv_pmci.c:173): error waiting for event
[mpiexec@n05] main (mpiexec/mpiexec.c:260): process manager error waiting for completion
(firedrake) Apptainer> exit
exit
[renato@n05 ~]$ apptainer exec -e spyro/spyro-1_latest.sif bash
Apptainer> . /home/firedrake/firedrake/bin/activate
(firedrake) Apptainer> mpiexec -n 6 python3 -c 'print(1)'
1
1
1
1
1
1
apptainer shell
还有 -e 标志。