说明
- 可以使用同一个 Singularity 镜像文件启动多个实例
- 确保实例名称、端口映射、MAC 不冲突
查看所有运行中的实例
1 2 3 4 5 6 7 8
| // 查看所有运行中的实例 singularity instance list
// 启动实例 singularity instance start 参数 xxx
// 停止实例 singularity instance stop xxx
|
以 systemd 服务运行
示例
/etc/systemd/system/asr_railway_gpu_0.service
1 2 3 4 5 6 7 8 9 10 11 12 13
| [Unit] Description=asr_railway_gpu_0 After=network.target deviceQuery.target
[Service] Type=forking Environment="SINGULARITYENV_CUDA_VISIBLE_DEVICES=0" ExecStart=/usr/bin/singularity instance start -B $PWD/logs:/opt/logs -B $PWD/license:/opt/license -B $PWD/data:/opt/data --nv --contain --cleanenv --writable-tmpfs --hostname localhost --net --network-args "portmap=8867:8885/tcp,MAC=12:34:56:78:01:01" $PWD/asr-railway-gpu.sif asr_railway_gpu_0 ExecStop=/usr/bin/singularity instance stop asr_railway_gpu_0 SuccessExitStatus=143
[Install] WantedBy=multi-user.target
|
Environment 详解
Environment="SINGULARITYENV_CUDA_VISIBLE_DEVICES=0"
设置容器内的 CUDA 可见性,限制容器内的应用只能访问主机的第一块 GPU(索引为 0)
传递多个 CUDA 参数
1
| Environment="SINGULARITYENV_CUDA_VISIBLE_DEVICES=0,1"
|
多个参数
1 2
| Environment="PATH=/opt/myapp/bin:$PATH" Environment="SINGULARITYENV_CUDA_VISIBLE_DEVICES=0" "SINGULARITYENV_LOG_LEVEL=debug"
|
ExecStart 内容详解
1. 基本命令部分
1
| /usr/bin/singularity instance start
|
singularity instance start
:启动一个持久运行的容器实例(类似于后台服务)。
instance
模式允许同时运行多个相同镜像的实例,并通过名称管理它们。
2. 目录挂载参数
1 2 3
| -B $PWD/logs:/opt/logs \ -B $PWD/license:/opt/license \ -B $PWD/data:/opt/data \
|
- -B(或 –bind):将主机目录挂载到容器内的指定路径。
- $PWD/logs:/opt/logs:挂载当前目录下的 logs 目录到容器的 /opt/logs,用于存储日志
- $PWD/license:/opt/license:挂载许可证文件目录。
- $PWD/data:/opt/data:挂载应用数据目录。
- GPU 支持参数
--nv
:启用 NVIDIA GPU 支持,允许容器内的应用访问主机的 GPU 设备。
- 相当于在容器内注入 NVIDIA 驱动和 CUDA 库。
4. 容器隔离参数
1 2
| --contain \ --cleanenv \
|
--contain
:增强容器的隔离性,限制对主机系统的访问(如不共享 /tmp
目录)。
--cleanenv
:清除容器内的环境变量,仅保留显式设置的变量(如 CUDA_VISIBLE_DEVICES
)。
5. 临时文件系统参数
--writable-tmpfs
:为容器的 /tmp
目录创建可写的临时文件系统(基于内存)。
- 提高容器的安全性,避免写入持久存储。
6. 网络配置参数
1 2 3 4
| --hostname localhost \ --net \ --network-args "portmap=8867:8885/tcp,MAC=12:34:56:78:01:01" \
|
--hostname localhost
:设置容器内的主机名为 localhost
。
--net
:启用容器网络栈(默认情况下,Singularity 容器共享主机网络)。
--network-args
1 2 3 4 5 6 7 8 9 10 11 12
| :配置网络参数:
- `portmap=8867:8885/tcp`:将主机的 8867 端口映射到容器的 8885 端口(TCP 协议)。 - `MAC=12:34:56:78:01:02`:为容器分配自定义 MAC 地址(用于网络识别),保证唯一性。
#### 7. **镜像与实例名称**
```bash $PWD/asr-railway-gpu.sif asr_railway_gpu_0
|
$PWD/asr-railway-gpu.sif
:指定 Singularity 镜像文件的路径(.sif
是 Singularity 的标准镜像格式)。
asr_railway_gpu_0
:为容器实例指定名称,用于后续管理(如停止实例)。
注意事项
- 实例名称必须唯一(如
asr_railway_gpu_0
, asr_railway_gpu_1
)
- 端口映射不能冲突(如主机端口 8867→8868→8869…)
- MAC 地址必须唯一(否则网络会冲突)
- GPU 分配:通过
CUDA_VISIBLE_DEVICES
环境变量指定不同 GPU(0, 1, 2…)