使用OBS上传大文件并再modelArts服务器上访问

背景

我需要在华为服务器上跑代码,数据集达45G,单次只能从本地上传100M,然后听说大文件通过OBS很方便,这里记录如何使用OBS来上传,看要求这里应该是只需要一个OBS的URL。

在Notebook中可以通过调用ModelArts的Moxing接口或者SDK接口与OBS交互,将Notebook中的文件上传至OBS,或者下载OBS中的文件至Notebook中。MoXing是ModelArts自研的分布式训练加速框架,MoXing提供了一套文件对象API,可以用来读写OBS文件。

image-20250805191214225

img

首先学习OBS的基本概念

  1. 使用华为云的对象存储服务就是OBS,你需要把本地的文件拷贝到OBS中,然后在notebook里访问OBS
  2. 首先需要在华为云的OBS里创建一个帐号再创建一个筒,这个桶里有桶名称,账户AK,密码SK,和地址,这个地址是提供OBS服务的地址,也叫做Endpoint
  3. 然后再在本地使用obsutil或者其他的obs browser等软件,把本地的数据集上传到OBS,这里需要配置OBS的地址密码
  4. 在OBS中有了数据集之后,就可以在notebook中访问OBS的文件,把数据集下载到notebook中或者说直接访问OBS中的数据集

创建OBS桶(对应基本概念里的1)

点击就创建好了

image-20250805192421049

OBS的信息(对应基本概念里的2)

  1. 点击这里获得AK和SK

image-20250805195507566

这里需要创建访问密钥

image-20250805195634310

  1. 然后会下载一个CSV,我的CSV里是这样的,里面就是AK和SK

    1
    2
    User Name,Access Key Id,Secret Access Key
    "mindspore-houbosen",GK2KEZTVRRGWN2L9FQKT,lbKRy9E2PjmWsfv5kB39ck3lW3RV1pXpNmKlQ6Rv
  2. 点击概览获得endpoint

    1
    2
    3
    4
    # Endpoint
    obs.cn-north-305.tjaicc.com
    # 然后这里还有一个访问域名,介绍说是可以直接访问这个桶
    dtu.obs.cn-north-305.tjaicc.com

image-20250805195404076

上传文件到OBS桶(对应基本概念里的3)

这里有多种方式把本地的文件上传到OBS桶,首先再次整理以下当前的各种信息

User Name “mindspore-houbosen”
Access Key Id(AK) GK2KEZTVRRGWN2L9FQKT
Secret Access Key lbKRy9E2PjmWsfv5kB39ck3lW3RV1pXpNmKlQ6Rv
Endpoint obs.cn-north-305.tjaicc.com
访问域名 dtu.obs.cn-north-305.tjaicc.com
bucketName dtu

安装和配置OBSUtil(需要进入到obsutil中使用)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
wget https://obs-community.obs.cn-north-1.myhuaweicloud.com/obsutil/current/obsutil_linux_amd64.tar.gz
# wget https://obs-community.obs.cn-north-1.myhuaweicloud.com/obsutil/current/obsutil_linux_arm64.tar.gz
tar -xzvf obsutil_linux_amd64.tar.gz
进入obsutil所在目录。“x.x.x”表示obsutil的版本号
cd obsutil_linux_amd64_x.x.x
chmod 755 obsutil
继续在目录中执行以下命令,如果能顺利返回obsutil版本号,说明安装成功。
./obsutil version

./obsutil config -interactive
# 查看配置
cat /home/ma-user/.obsutilconfig
# 更新配置文件
./obsutil config -interactive
# 检查连通性,可以看到我们创建好的桶dtu已经存在了
./obsutil ls -s
Start at 2025-08-05 12:24:08.198333261 +0000 UTC

obs://checkpoints
obs://dtu
obs://f5d4f1084b8b458294a6d6e61e87383b
obs://mindsporesig
obs://qwen3-0.6b
obs://ringmoe
Bucket number: 6

上传

1
2

./obsutil cp /media/outbreak/68E1-B517/Dataset/DTU_ZIP/dtu_training/mvs_training/dtu_training obs://dtu/dtu_training/ -r -f -j=10 -p=10

Notebook与OBS文件交互(对应基本概念里的4)

在Notebook中可以通过调用ModelArts的Moxing接口或者SDK接口与OBS交互,将Notebook中的文件上传至OBS,或者下载OBS中的文件至Notebook中。MoXing是ModelArts自研的分布式训练加速框架,MoXing提供了一套文件对象API,可以用来读写OBS文件。

/home/ma-user/work目录下的数据会保存,其余目录下内容会被清理

方法一:在Notebook中通过Moxing上传下载OBS文件(据说最方便)

1
2
3
4
5
6
7
8
9
10
11
import moxing as mox

#下载一个OBS文件夹sub_dir_0,从OBS下载至Notebook
mox.file.copy_parallel('obs://bucket_name/sub_dir_0', '/home/ma-user/work/sub_dir_0')
#下载一个OBS文件obs_file.txt,从OBS下载至Notebook
mox.file.copy('obs://bucket_name/obs_file.txt', '/home/ma-user/work/obs_file.txt')

#上传一个OBS文件夹sub_dir_0,从Notebook上传至OBS
mox.file.copy_parallel('/home/ma-user/work/sub_dir_0', 'obs://bucket_name/sub_dir_0')
#上传一个OBS文件obs_file.txt,从Notebook上传至OBS
mox.file.copy('/home/ma-user/work/obs_file.txt', 'obs://bucket_name/obs_file.txt')

方法二:在Notebook中通过ModelArts SDK上传下载OBS文件

使用ModelArts SDK接口将OBS中的文件下载到Notebook后进行操作。

1
2
3
4
5
6
7
8
9
from modelarts.session import Session
session = Session()
session.obs.download_file(src_obs_file="obs://bucket-name/dir1/file1.txt", dst_local_dir="/home/ma-user/work/")
# 将OBS中的文件夹dir1下载到Notebook的/home/ma-user/work/路径下
session.obs.download_dir(src_obs_dir="obs://bucket-name/dir1/", dst_local_dir="/home/ma-user/work/")
# 将Notebook中的file1.txt文件上传到OBS桶路径obs://bucket-name/dir1/中
session.obs.upload_file(src_local_file='/home/ma-user/work/file1.txt', dst_obs_dir='obs://bucket-name/dir1/')
session.obs.upload_dir(src_local_dir='/home/ma-user/work/', dst_obs_dir='obs://bucket-name/dir1/')

方法三:在Notebook中通过OBSutil上传下载OBS文件

超大文件,建议以zip压缩包的方式上传到obs。如果需要使用,先拷贝到notebook,再解压,再回传到obs中的cache目录即可,使用完cache目录可删除?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 首先初始化
# 初始化配置
./obsutil config -i=ak -k=sk -e=endpoint
# 或者不用上面那个方法,用下面这个交互的,其中token那一项不用填写直接回车
./obsutil config -interactive


# 查看配置
cat /home/ma-user/.obsutilconfig
# 更新配置文件
./obsutil config -interactive
# 检查连通性
./obsutil ls -s

# 上传文件夹到obs
./obsutil cp /home/ma-user/work/MyDocuments obs://liulingjun-demo/cache/ -r -f -j=10 -p=10

# 删除单个文件
./obsutil rm obs://bucket-test/key -f
# 删除文件夹
./obsutil rm obs://bucket-test -r -f -j=10 -p=10

# 拷贝zip文件到obs
./obsutil cp obs://lljyoyo-demo/datasets/ImageNet2012/train.zip /home/ma-user/work/ImageNet2012/train.zip
# 解压zip文件
cd /home/ma-user/work/ImageNet2012
unzip train.zip

# 文件回传obs的cache目录
./obsutil cp /home/ma-user/work/ImageNet2012/train obs://lljyoyo-demo/cache/ImageNet2012 -f -r
# 使用完删除cache目录

方法四:在Notebook中使用OBS SDK上传下载OBS文件

SDK支持上传0KB~5GB的对象。流式上传、文件上传和追加上传每次上传内容大小不能超过5GB;当上传较大文件时,请使用分段上传,分段上传每段内容大小不能超过5GB。批量复制时的最大并发数,-j=10;

1
2
# .obsutilconfig 配置文件所在路径 /home/ma-user/.obsutilconfig
# pip3 install esdk-obs-python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#!/usr/bin/python
# -*- coding:utf-8 -*-
from obs import *

AK = 'GK2KEZTVRRGWN2L9FQKT'
SK = 'lbKRy9E2PjmWsfv5kB39ck3lW3RV1pXpNmKlQ6Rv'
server = 'obs.cn-north-305.tjaicc.com'
bucketName = 'dtu'
objectKey = 'dtu_training/'
localFile = '/home/ma-user/work/dtu_training/'


# 单文件下载
def download_file():
# Constructs a obs client instance with your account for accessing OBS
obsClient = ObsClient(access_key_id=AK, secret_access_key=SK, server=server)

# Download the object to a file
print('Downloading an object to :' + localFile + '\n')
obsClient.getObject(bucketName, objectKey, downloadPath=localFile)
# 断点续传下载
def download_file_v1():
# Download the object to a file
print('Downloading an object to :' + localFile + '\n')

# 下载时的最大并发数
taskNum = 5
# 分段大小,单位字节,取值范围是100KB~5GB,默认为5MB。
partSize = 10 * 1024 * 1024
obsClient = ObsClient(access_key_id=AK, secret_access_key=SK, server=server)
resp = obsClient.downloadFile(bucketName, objectKey=objectKey, downloadFile=localFile, partSize=partSize, taskNum=5, enableCheckpoint=True)

if resp.status < 300:
print('requestId:', resp.requestId)
else:
print('errorCode:', resp.errorCode)
print('errorMessage:', resp.errorMessage)
# 单文件上传
def update_file():
# Create bucket
print('Create a new bucket for demo\n')
obsClient.createBucket(bucketName)

# Upload an object to your bucket
print('Uploading a new object to OBS from a file\n')
obsClient.putFile(bucketName, objectKey, localFile)
# 断点续传上传(推荐)
def update_file_v1():
# Create bucket
print('Create a new bucket for demo\n')
obsClient.createBucket(bucketName)

# Upload an object to your bucket
print('Uploading a new object to OBS from a file\n')

# 下载时的最大并发数
taskNum = 5
# 分段大小,单位字节,取值范围是100KB~5GB,默认为5MB。
partSize = 10 * 1024 * 1024
try:
resp = obsClient.uploadFile(bucketName, objectKey, uploadFile=localFile, partSize=partSize, taskNum=taskNum, enableCheckpoint=True)
if resp.status < 300:
print('requestId:', resp.requestId)
else:
print('errorCode:', resp.errorCode)
print('errorMessage:', resp.errorMessage)
except:
import traceback
print(traceback.format_exc())


if __name__ == '__main__':
download_file_v1()
# download_file_v1()

还有两个方法是通过notenook控制台和OBSBrowser+

参考文献

这个文档不赖

这个是对上面那个教程的整理