说明

  • 可以使用同一个 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"  # 允许多个 GPU

多个参数

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:挂载应用数据目录。
  1. GPU 支持参数
1
--nv
  • --nv:启用 NVIDIA GPU 支持,允许容器内的应用访问主机的 GPU 设备。
  • 相当于在容器内注入 NVIDIA 驱动和 CUDA 库。

4. 容器隔离参数

1
2
--contain \
--cleanenv \
  • --contain:增强容器的隔离性,限制对主机系统的访问(如不共享 /tmp 目录)。
  • --cleanenv:清除容器内的环境变量,仅保留显式设置的变量(如 CUDA_VISIBLE_DEVICES)。

5. 临时文件系统参数

1
2
--writable-tmpfs

  • --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:为容器实例指定名称,用于后续管理(如停止实例)。

注意事项

  1. 实例名称必须唯一(如 asr_railway_gpu_0, asr_railway_gpu_1
  2. 端口映射不能冲突(如主机端口 8867→8868→8869…)
  3. MAC 地址必须唯一(否则网络会冲突)
  4. GPU 分配:通过 CUDA_VISIBLE_DEVICES 环境变量指定不同 GPU(0, 1, 2…)