跳转至

对象存储 OSS

集群已将 OSS Bucket stellaredge 挂载到登录节点和 GPU 节点:

/oss/stellaredge

你也可以使用 ossutil 或阿里云 OSS SDK 直接传输文件。

什么时候使用 OSS

OSS 适合存放数据集、模型、训练结果和需要长期保存的归档文件。

  • 作业中的临时文件、缓存和高频随机读写使用 $LOCAL_SCRATCH
  • 需要标准 Linux 文件系统语义或多节点共享读写时使用 $HOME/project
  • 大文件和大量文件的上传、下载优先使用 ossutil,不要依赖 cp -r 操作挂载目录。

Note

OSS 是对象存储,不是完整的 POSIX 文件系统。避免多个作业同时修改同一个文件, 也不要依赖原子 rename、文件锁、chmodchown

通过挂载目录访问

检查挂载是否可用:

findmnt /oss/stellaredge
ls -la /oss/stellaredge

可以像普通目录一样读取或复制文件:

cp /oss/stellaredge/datasets/example.tar "$HOME/"
cp ./result.json /oss/stellaredge/results/result.json

依赖 OSS 的作业应先检查挂载:

if ! findmnt /oss/stellaredge >/dev/null; then
  echo 'OSS mount is unavailable' >&2
  exit 1
fi

使用 ossutil

集群已经安装并配置 ossutil。使用管理员提供的配置文件,不要查看、复制或修改它:

OSS_CONFIG=/etc/cluster-object-storage/ossutil.ini
BUCKET=stellaredge
PREFIX='请替换为你的目录前缀/'

列出文件:

ossutil --ignore-env-var -c "$OSS_CONFIG" \
  ls "oss://$BUCKET/$PREFIX"

上传和下载:

# 上传一个文件
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 -rsync --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 示例:

python -m pip install --user oss2
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 官方文档