对象存储 OSS¶
集群已将 OSS Bucket stellaredge 挂载到登录节点和 GPU 节点:
你也可以使用 ossutil 或阿里云 OSS SDK 直接传输文件。
什么时候使用 OSS¶
OSS 适合存放数据集、模型、训练结果和需要长期保存的归档文件。
- 作业中的临时文件、缓存和高频随机读写使用
$LOCAL_SCRATCH; - 需要标准 Linux 文件系统语义或多节点共享读写时使用
$HOME或/project; - 大文件和大量文件的上传、下载优先使用
ossutil,不要依赖cp -r操作挂载目录。
Note
OSS 是对象存储,不是完整的 POSIX 文件系统。避免多个作业同时修改同一个文件,
也不要依赖原子 rename、文件锁、chmod 或 chown。
通过挂载目录访问¶
检查挂载是否可用:
可以像普通目录一样读取或复制文件:
cp /oss/stellaredge/datasets/example.tar "$HOME/"
cp ./result.json /oss/stellaredge/results/result.json
依赖 OSS 的作业应先检查挂载:
使用 ossutil¶
集群已经安装并配置 ossutil。使用管理员提供的配置文件,不要查看、复制或修改它:
列出文件:
上传和下载:
# 上传一个文件
ossutil --ignore-env-var -c "$OSS_CONFIG" \
cp ./result.txt "oss://$BUCKET/$PREFIX/result.txt"
# 下载一个文件
ossutil --ignore-env-var -c "$OSS_CONFIG" \
cp "oss://$BUCKET/$PREFIX/dataset.tar" ./dataset.tar
# 上传整个目录;末尾的 / 表示目录内容
ossutil --ignore-env-var -c "$OSS_CONFIG" \
cp -r ./results/ "oss://$BUCKET/$PREFIX/results/"
操作前确认 Bucket 和前缀。除非明确知道影响范围,否则不要使用 rm -r、
sync --delete 或覆盖已有对象。
在 Slurm 作业中使用¶
推荐先把输入复制到节点本地 scratch,计算完成后再把结果上传到 OSS:
#!/usr/bin/env bash
#SBATCH --account=project-example
#SBATCH --partition=gpu-full
#SBATCH --gres=gpu:h20:1
#SBATCH --tmp=102400
set -euo pipefail
OSS_CONFIG=/etc/cluster-object-storage/ossutil.ini
BUCKET=stellaredge
PREFIX='请替换为你的目录前缀/'
mkdir -p "$LOCAL_SCRATCH/dataset" "$LOCAL_SCRATCH/output"
ossutil --ignore-env-var -c "$OSS_CONFIG" \
cp "oss://$BUCKET/$PREFIX/dataset.tar" "$LOCAL_SCRATCH/dataset.tar"
tar -xf "$LOCAL_SCRATCH/dataset.tar" -C "$LOCAL_SCRATCH/dataset"
python train.py \
--data "$LOCAL_SCRATCH/dataset" \
--output "$LOCAL_SCRATCH/output"
ossutil --ignore-env-var -c "$OSS_CONFIG" \
cp -r "$LOCAL_SCRATCH/output/" \
"oss://$BUCKET/$PREFIX/jobs/$SLURM_JOB_ID/"
本地 scratch 会按集群策略清理。重要结果和检查点必须在清理前上传到 OSS,或复制到
/project、$HOME。
容器作业¶
如果容器内无法访问 ossutil 或其配置文件,建议在容器启动前下载输入,并在容器
结束后上传输出。不要把集群配置文件复制到容器镜像、代码仓库或作业日志中。
使用 SDK¶
需要在程序中直接访问 OSS 时,使用官方 SDK。不要在源代码、Notebook、Git 仓库或 命令行参数中写入访问凭据;从集群提供的配置文件读取凭据,并且不要打印其内容。
Python 示例:
import configparser
import oss2
config = configparser.ConfigParser()
config.read("/etc/cluster-object-storage/ossutil.ini")
profile = config["default"]
auth = oss2.AuthV4(
profile["accessKeyID"],
profile["accessKeySecret"],
)
bucket = oss2.Bucket(
auth,
"https://oss-cn-shanghai-internal.aliyuncs.com",
"stellaredge",
region="cn-shanghai",
)
for item in oss2.ObjectIterator(bucket, prefix="请替换为你的目录前缀/"):
print(item.key)
官方 SDK 文档:
常见问题¶
AccessDenied¶
确认使用了分配给你的 Bucket 前缀。如果仍然失败,请把执行的命令、目标路径和错误 信息发给管理员;不要复制配置文件或凭据。
挂载目录不可用¶
先尝试使用 ossutil。如果 ossutil 也失败,请联系管理员。OSS 挂载不可用不会
自动保留 $LOCAL_SCRATCH 中的作业结果。
连接超时¶
OSS 使用集群内网访问,不需要设置出口代理。如果 Shell 中配置了代理,可先执行:
export NO_PROXY="${NO_PROXY:+$NO_PROXY,}oss-cn-shanghai-internal.aliyuncs.com,.oss-cn-shanghai-internal.aliyuncs.com"
export no_proxy="$NO_PROXY"
更多命令见 ossutil 官方文档。