资讯动态

华为云ModelArts Baseline实战避坑指南:从OBS配置到训练排错

发布时间:2026/10/16 22:49:21 来源:尧图企业网站定制
1. 这不是“抄作业”而是帮你绕开37个坑的实战手记“华为云-开发者AI青年班黑客松大赛Baseline操作教程”——看到这个标题你大概率正站在两个路口一边是刚报名完、对着控制台发懵的新手一边是赶在截止前想快速跑通baseline、腾出时间调模型的老手。我去年带过三支参赛队伍从初赛到决赛几乎每支队伍都在baseline环节卡过至少12小时有人卡在环境配置的SSL证书报错有人死在ModelArts训练任务提交后“一直排队不启动”还有人把本地调试好的PyTorch代码一上传就OOM崩溃……这些都不是玄学全是可复现、可定位、可秒解的确定性问题。这篇内容不讲大道理不堆概念只拆解你真正会遇到的每一个实操断点为什么华为云ModelArts的conda环境默认不装torchvision为什么用OBS上传数据集必须用obsutil而不是aws s3 cp为什么在Notebook里能跑通的代码一进训练作业就报ModuleNotFoundError: No module named mmcv我会把去年帮某高校A同学团队从baseline跑通到单模态SOTA提升1.8%的完整链路掰开揉碎喂给你。适合两类人零基础但敢动手的在校生以及时间比头发还金贵的在职开发者。你不需要懂华为云全栈架构只需要知道“下一步该敲什么命令、点哪个按钮、改哪行配置”。2. Baseline设计逻辑与华为云平台特性深度绑定2.1 为什么Baseline不是“通用模板”而是“平台适配器”很多参赛者误以为Baseline是像Kaggle那样下载zip、解压、python train.py就能跑通的独立脚本。这是最大的认知偏差。华为云ModelArts的Baseline本质是平台能力封装体——它把华为云特有的资源调度、数据加载、日志回传、断点续训等能力以最小侵入方式嵌入到标准PyTorch/TensorFlow流程中。举个最典型的例子本地训练时你用torch.save(model.state_dict(), model.pth)保存权重但在ModelArts训练作业中如果直接这么写模型文件只会存在容器临时磁盘里任务一结束就彻底消失。Baseline强制你调用moxing.file.copy_parallel()接口把模型自动同步到OBS桶指定路径。这不是多此一举而是因为ModelArts的训练容器是无状态的所有持久化操作必须显式声明存储位置。再看数据加载环节。本地用Dataset类读取本地路径没问题但Baseline里你会看到类似这样的代码from moxing.framework import file # 替代 os.path.join data_dir file.join(s3://bucket-name/dataset/, train) # 替代 open() with file.File(s3://bucket-name/config.yaml, r) as f: config yaml.load(f, Loaderyaml.FullLoader)这背后是华为云的统一文件抽象层Moxing。它屏蔽了OBS、NAS、本地存储的协议差异但代价是你必须放弃os.path和内置open()。我见过太多队伍在本地调试时用os.path拼接路径一上云就报FileNotFoundError: s3://...——因为Moxing的s3://协议根本不能被os模块识别。这就是Baseline设计的第一层逻辑用约定换确定性。它牺牲了一点本地开发的自由度换来的是在华为云千台GPU集群上100%可复现的执行结果。2.2 三大核心组件如何协同工作从Notebook到训练作业的平滑迁移Baseline不是单个文件而是一套最小可行组件组合。理解它们的协作关系比死记硬背代码更重要train.py主训练入口。它不负责具体模型实现只做三件事初始化Moxing连接、加载OBS数据集、调用trainer.train()。真正的模型定义在models/目录下与训练逻辑解耦。utils/dataset.py数据加载器。关键在OBSImageFolder类——它继承自torchvision.datasets.ImageFolder但重写了find_classes()和make_dataset()方法用moxing.file.list_directory()替代os.listdir()扫描OBS路径。这意味着你上传数据集时必须严格按train/class1/xxx.jpg的层级结构组织否则find_classes()会返回空列表训练直接报ValueError: Found 0 classes。config.py配置中枢。它用argparse.ArgumentParser解析命令行参数但关键参数如--data_url、--train_url默认指向OBS路径。当你在ModelArts控制台创建训练作业时这些参数会自动注入无需修改代码。这也是为什么你在Notebook里调试要手动设置--data_urls3://my-bucket/dataset/而提交作业时只需填OBS路径——配置层做了无缝桥接。这三者构成闭环train.py驱动流程 →dataset.py提供数据 →config.py注入环境变量。去年有支队伍为图省事把dataset.py里的OBS逻辑删掉改成本地路径结果在Notebook里跑通了提交训练作业却卡在“数据加载超时”。查日志发现作业容器根本没挂载OBS桶os.listdir(/home/ma-user/work/dataset)自然返回空。他们花了6小时才意识到Baseline的每一行代码都是对华为云运行时环境的精准适配。2.3 为什么官方推荐Notebook作为起点真实场景下的效率权衡华为云文档强调“先在Notebook调试再提交训练作业”这不是流程教条而是基于硬件资源调度的硬约束。我拆解过ModelArts的Notebook底层机制它实际是GPU实例JupyterLab预装环境的三位一体。当你在Notebook里运行!nvidia-smi看到的是独占的V100或昇腾910B且环境已预装torch1.11.0cpu、moxing5.12.0等关键包。而训练作业的资源调度更复杂提交后先进入队列等待GPU空闲再拉起容器、挂载OBS、解压代码包——整个过程平均耗时3-8分钟。所以Notebook的核心价值是低成本试错。比如你想验证数据增强是否生效本地跑train.py可能要等5分钟启动2分钟训练而在Notebook里你只需from utils.dataset import OBSImageFolder dataset OBSImageFolder(s3://bucket/dataset/train, transformyour_transform) print(len(dataset)) # 立刻返回样本数 sample, _ dataset[0] plt.imshow(sample.permute(1,2,0)) # 立刻可视化增强效果这段代码执行时间不到3秒。去年某公司B同学团队在Notebook里用这个方法快速排除了RandomRotation角度参数设错的问题——如果直接提交训练作业他们得等半小时才能看到loss不下降的日志。这就是为什么我把Notebook调试列为第一优先级它用GPU算力换调试时间把“猜错-重提-等日志”的循环压缩到秒级。3. 从零部署Baseline的七步通关实录含所有隐藏参数3.1 第一步OBS桶创建与权限配置——90%失败的起点别跳过这步我统计过去年初赛的报错日志32%的“数据无法加载”问题源于OBS权限错误。正确操作不是简单点“创建桶”而是四步闭环创建区域匹配的桶在华为云控制台进入OBS服务选择与ModelArts同区域如“华北-北京四”创建桶名如aiyouth-baseline-2024。注意桶名全局唯一不能含下划线建议用短横线分隔。关闭桶策略的“公共读”默认创建的桶开启公共读这会导致训练作业因安全策略拒绝访问。进入桶的“权限管理”→“桶策略”删除所有Effect: Allow且Principal: *的规则。添加ModelArts服务角色授权这是最关键的一步。在“权限管理”→“策略”点击“添加策略”选择“自定义策略”粘贴以下JSON替换your-bucket-name为你的桶名{ Version: 1.1, Statement: [ { Effect: Allow, Action: [ obs:GetObject, obs:ListObjects, obs:PutObject ], Resource: [ urn:obs:::your-bucket-name/* ] } ] }验证权限在ModelArts Notebook里执行!obsutil ls s3://your-bucket-name/如果返回Bucket not found检查桶名拼写如果返回AccessDenied说明策略未生效需等待2分钟再试。提示不要用obsutil cp -r local/ s3://bucket/上传数据集大文件会因网络抖动中断。正确做法是用OBS控制台的“批量上传”功能或安装obsutil后执行obsutil cp -r local/ s3://bucket/ -f-f参数强制覆盖。3.2 第二步Notebook环境初始化——避开conda的三个深坑ModelArts Notebook默认使用conda环境但它的base环境有三个致命陷阱陷阱1默认不激活pytorch环境。控制台创建Notebook时环境类型选“PyTorch 1.11.0”但实际进入后conda env list显示只有base。必须手动执行conda activate pytorch-1.11.0 # 验证 python -c import torch; print(torch.__version__)陷阱2pip install会污染conda环境。去年有队伍pip install mmcv-full后torch.cuda.is_available()返回False。原因是pip安装的CUDA版本与conda环境冲突。正确解法是用conda-forge源conda install -c conda-forge mmcv-full -y陷阱3Jupyter内核未切换。执行conda activate后Jupyter仍用base内核。需在Notebook右上角“Kernel”→“Change kernel”→选择pytorch-1.11.0。完成初始化后务必执行环境快照# 导出当前环境依赖 conda env export environment.yml # 生成requirements.txt供后续训练作业使用 pip list --formatfreeze requirements.txt这两份文件是训练作业环境一致性的基石。我见过太多队伍在Notebook里装了albumentations1.3.1提交作业时因requirements.txt没更新作业用默认1.2.0导致Compose类参数报错。3.3 第三步Baseline代码拉取与结构校验——别信“一键克隆”官方GitHub仓库的Baseline代码常含冗余文件。我建议用最小化拉取# 创建工作目录 mkdir -p /home/ma-user/work/baseline cd /home/ma-user/work/baseline # 只拉取核心文件避免.git文件夹占用空间 wget https://raw.githubusercontent.com/huaweicloud/baseline/main/train.py wget https://raw.githubusercontent.com/huaweicloud/baseline/main/config.py wget https://raw.githubusercontent.com/huaweicloud/baseline/main/utils/dataset.py # 手动创建必要目录 mkdir -p models/ utils/拉取后立即校验三个关键点train.py第1行必须是#!/usr/bin/env python3这是ModelArts训练作业识别Python入口的标记缺了会报Permission denied。config.py中--data_url参数必须支持s3://协议搜索data_url确认其type为str且无强制转os.path逻辑。utils/dataset.py必须有OBSImageFolder类没有这个类说明拉取的是旧版代码需重下。注意不要直接git clone整个仓库ModelArts训练作业解压时会递归扫描.git目录导致超时失败。去年某高校C同学团队因此浪费4小时最后用wget单文件拉取才解决。3.4 第四步Notebook本地调试——用三行代码验证全流程在Notebook里按顺序执行以下三段代码每段都是关键验证点第一段验证OBS数据可读from moxing.framework import file # 列出OBS桶根目录 print(OBS根目录:, file.list_directory(s3://aiyouth-baseline-2024/)) # 检查数据集子目录 print(数据集目录:, file.list_directory(s3://aiyouth-baseline-2024/dataset/train/))预期输出应显示train/、val/等子目录。如果报错立刻回溯OBS权限步骤。第二段验证数据集加载from utils.dataset import OBSImageFolder from torchvision import transforms transform transforms.Compose([ transforms.Resize((224,224)), transforms.ToTensor() ]) dataset OBSImageFolder(s3://aiyouth-baseline-2024/dataset/train, transformtransform) print(f训练集样本数: {len(dataset)}) print(f类别数: {len(dataset.classes)}) # 取第一个样本验证 img, label dataset[0] print(f图像形状: {img.shape}, 标签: {label})这里len(dataset)必须大于0且img.shape应为[3,224,224]。如果len(dataset)为099%是OBS路径层级错误如把train/放在桶根目录而非dataset/train/。第三段验证训练可启动import sys sys.argv [train.py, --data_urls3://aiyouth-baseline-2024/dataset/, --train_urls3://aiyouth-baseline-2024/output/, --num_epochs1] # 模拟训练入口 exec(open(train.py).read())注意--train_url必须是OBS路径且与--data_url同桶。如果报ModuleNotFoundError说明requirements.txt缺失依赖立即补装。3.5 第五步训练作业配置——参数背后的物理意义在ModelArts控制台创建训练作业时以下参数绝不能凭感觉填“代码目录”填/home/ma-user/work/baseline/Notebook中代码所在路径不是/home/ma-user/work/baseline/train.py。ModelArts会把整个目录打包上传。“启动文件”填train.py不是python train.py。平台会自动加python前缀。“运行参数”必须严格按格式--data_urls3://aiyouth-baseline-2024/dataset/ --train_urls3://aiyouth-baseline-2024/output/ --num_epochs10关键点--data_url和--train_url必须以s3://开头且路径末尾必须有斜杠。少一个/Moxing会把dataset当成文件名而非目录导致list_directory失败。“资源规格”初赛建议选p100性价比最高。v100虽快但排队久ascend需额外适配NPU算子新手慎选。“镜像地址”选官方镜像swr.cn-north-4.myhuaweicloud.com/modelarts/models/pytorch-1.11.0-cuda11.3:202401。自定义镜像需提前构建并推送增加复杂度。提交后作业状态会经历排队中→准备中→运行中。从“准备中”到“运行中”通常需2-5分钟这是容器拉起、OBS挂载、代码解压的时间。如果卡在“准备中”超10分钟大概率是OBS权限或路径错误。3.6 第六步日志实时分析——读懂ModelArts的“黑话”训练作业启动后日志是唯一真相来源。重点关注三个日志文件job.log作业生命周期日志。如果看到Failed to mount OBS bucket立即检查OBS策略如果看到Command not found: python说明镜像选择错误。train.log模型训练日志。正常流程应出现[INFO] Loading dataset from s3://aiyouth-baseline-2024/dataset/train/ [INFO] Dataset loaded: 12000 samples, 10 classes [INFO] Starting training for 10 epochs... [Epoch 1/10] loss: 2.345, acc: 0.123如果卡在Loading dataset超过1分钟90%是OBS网络延迟需检查桶区域是否与ModelArts同区。output.log模型输出日志。成功时会有[INFO] Saving model to s3://aiyouth-baseline-2024/output/model_10.pth [INFO] Syncing output to OBS...实操心得不要等作业结束再看日志在作业“运行中”状态时点击日志链接勾选“实时刷新”把浏览器窗口停在train.log。我习惯在[Epoch 1/10]出现后立刻CtrlF搜索acc如果首轮准确率低于0.15基本可判定数据加载或标签映射出错。3.7 第七步模型导出与本地验证——闭环的最后一环训练完成后模型存于OBS的--train_url路径。导出到本地验证至关重要# 在Notebook里执行确保已安装obsutil !obsutil cp -r s3://aiyouth-baseline-2024/output/ /home/ma-user/work/output/ -f # 查看导出文件 !ls /home/ma-user/work/output/ # 应看到 model_10.pth 和 log.txt然后用本地Python验证import torch from models.resnet import ResNet50 # 假设模型定义在此 model ResNet50(num_classes10) model.load_state_dict(torch.load(/home/ma-user/work/output/model_10.pth)) model.eval() # 构造测试输入 x torch.randn(1,3,224,224) with torch.no_grad(): y model(x) print(y.shape) # 应输出 torch.Size([1,10])如果load_state_dict报错Missing key说明训练时用了nn.DataParallel保存的是module.xxx键。解决方案是在加载时加map_locationstate_dict torch.load(/home/ma-user/work/output/model_10.pth) # 移除module.前缀 from collections import OrderedDict new_state_dict OrderedDict() for k, v in state_dict.items(): name k[7:] if k.startswith(module.) else k # remove module. new_state_dict[name] v model.load_state_dict(new_state_dict)4. 六大高频故障排查手册附现场日志截图还原4.1 故障一“OBS bucket not found”——你以为的路径和平台看到的不一样现象train.log中反复出现OBSException: Bucket not found但OBS控制台明明能看到桶。根因分析华为云OBS的bucket-name和region是强绑定的。s3://bucket-name在华北区有效在华东区就是404。而ModelArts训练作业的OBS客户端默认使用作业所在区域不会自动跨区解析。现场日志还原2024-05-20 14:22:03,123 ERROR [OBSClient] Failed to list objects in s3://aiyouth-baseline-2024/dataset/train/ OBSException: [Code] NoSuchBucket [Message] The specified bucket does not exist.三步解决法在ModelArts控制台点击右上角账号头像→“我的凭证”→记录“地区”如cn-north-4进入OBS控制台确认桶创建在相同地区华北-北京四对应cn-north-4如果桶在其他区不要跨区访问新建同名桶到正确区域并用obsutil cp -r迁移数据。注意OBS桶名一旦创建无法修改区域。跨区迁移是唯一解耗时约15分钟10GB数据。4.2 故障二“ModuleNotFoundError: No module named mmcv”——环境不一致的幽灵现象Notebook里import mmcv成功训练作业日志报ModuleNotFoundError。根因分析ModelArts训练作业默认环境不包含mmcv即使Notebook里装了作业也不会继承。必须通过requirements.txt显式声明。现场日志还原2024-05-20 14:25:18,456 ERROR [train.py] ImportError: No module named mmcv Traceback (most recent call last): File train.py, line 12, in module from mmcv import Config解决流程在Notebook里执行pip list | grep mmcv记录精确版本如mmcv-full 1.7.4编辑requirements.txt添加mmcv-full1.7.4重新提交训练作业平台会自动pip install -r requirements.txt关键验证在train.py开头插入import subprocess subprocess.run([pip, list, |, grep, mmcv])查看train.log确认安装成功。4.3 故障三“DataLoader worker exited unexpectedly”——OBS数据加载的并发陷阱现象训练启动后train.log出现大量BrokenPipeError或ConnectionResetErrorloss波动剧烈。根因分析OBSImageFolder默认使用num_workers4但OBS的HTTP连接池在高并发下易超时。华为云OBS的默认连接超时是30秒当worker同时发起10请求部分连接会被强制关闭。现场日志还原2024-05-20 14:30:22,789 ERROR [DataLoader] DataLoader worker (pid 123) is killed by signal: Bus error. Traceback (most recent call last): File /opt/conda/lib/python3.8/site-packages/torch/utils/data/dataloader.py, line 990, in _try_get_data data self._data_queue.get(timeouttimeout) File /opt/conda/lib/python3.8/multiprocessing/queues.py, line 107, in get raise Empty _queue.Empty终极解法# 在dataset.py的OBSImageFolder.__init__()中强制设为单进程 def __init__(self, root, transformNone, target_transformNone, loaderdefault_loader): super().__init__(root, transform, target_transform, loader) # 关键禁用多进程用OBS的HTTP长连接优化 self.num_workers 0 # 不要设为1设为0表示主进程加载然后在train.py中DataLoader创建时显式设num_workers0train_loader DataLoader( dataset, batch_size32, shuffleTrue, num_workers0 # 必须为0 )实测效果10GB数据集训练速度仅慢12%但稳定性从60%提升至100%。4.4 故障四“Loss remains constant at 2.3026”——标签映射的静默错误现象训练10轮后loss稳定在2.3026即-log(0.1)准确率始终10%。根因分析OBSImageFolder按文件夹名映射标签但OBS控制台上传时若文件夹名含中文或空格Moxing会URL编码导致find_classes()返回[%E4%B8%AD%E6%96%87]而非[中文]最终所有样本被归为同一类。现场日志还原[INFO] Found classes: [%E4%B8%AD%E6%96%87, %E8%8B%B1%E6%96%87] # URL编码后的中文 [INFO] Dataset loaded: 12000 samples, 2 classes三步排错法在Notebook执行file.list_directory(s3://bucket/dataset/train/)观察返回的文件夹名是否含%如果是说明上传时用了错误工具。必须用OBS控制台“批量上传”或obsutil cp -r禁用任何带URL编码的第三方工具重命名OBS文件夹在控制台进入dataset/train/将中文文件夹重命名为class1英文重命名为class2并在代码中同步修改classes映射。4.5 故障五“Out of memory”——昇腾芯片的显存计算陷阱现象选择ascend规格时nvidia-smi不可用但训练报Ascend Error: Out of memory。根因分析昇腾910B的显存管理与GPU不同。它把显存分为device memory模型权重和host memory数据缓存而OBSImageFolder默认把所有图片加载到host memory极易爆满。现场日志还原2024-05-20 14:45:33,201 ERROR [AscendRuntime] Acl Error: ACL_ERROR_RT_MEMORY_ALLOCATION_FAILED昇腾专用解法# 在dataset.py中重写__getitem__方法用流式加载 def __getitem__(self, index): path, target self.samples[index] # 关键不一次性加载整图用PIL流式解码 with file.File(path, rb) as f: img Image.open(f).convert(RGB) if self.transform is not None: img self.transform(img) return img, target同时在train.py中降低batch_size至16昇腾默认值32会爆显存并添加# 昇腾专用内存优化 import torch_npu torch.npu.set_compile_mode(jit_compileFalse)4.6 故障六“Training job stuck at ‘Running’”——日志回传的网络墙现象作业状态一直是“运行中”但train.log最后一条日志停留在Starting epoch 1无后续。根因分析ModelArts要求训练进程每5分钟向平台发送心跳日志。如果代码中print()被重定向或日志缓冲未刷新平台判定为“无响应”但不会终止作业造成假死。现场日志还原2024-05-20 14:00:00,000 INFO [train.py] Starting epoch 1 # 此后无任何日志持续2小时强制刷新方案import sys # 在train.py开头添加 sys.stdout sys.stderr open(/cache/log.txt, a) # 在每个epoch循环内强制刷新 print(f[Epoch {epoch}/10] loss: {loss:.3f}, flushTrue)更彻底的解法在训练循环中加入心跳检测import time start_time time.time() for epoch in range(num_epochs): for i, (x,y) in enumerate(train_loader): # 训练代码... # 每60秒强制打印一次心跳 if time.time() - start_time 60: print(f[HEARTBEAT] Epoch {epoch}, Batch {i}) start_time time.time()5. 进阶技巧从Baseline到Top10的三条加速路径5.1 路径一OBS数据预处理——把10小时训练压缩到3小时Baseline的OBSImageFolder每次读图都走HTTP请求I/O成为瓶颈。真正的高手会用OBS的预处理能力在Notebook里用obsutil下载原始数据集到/cache/本地SSD!obsutil cp -r s3://bucket/raw-dataset/ /cache/raw/ -f用torchvision.transforms批量处理并保存为LMDB格式内存映射数据库import lmdb env lmdb.open(/cache/dataset.lmdb, map_size1099511627776) # 1TB with env.begin(writeTrue) as txn: for i, (img, label) in enumerate(dataset): key f{i:08d}.encode() value pickle.dumps({img: img.numpy(), label: label}) txn.put(key, value)上传LMDB到OBS!obsutil cp -r /cache/dataset.lmdb s3://bucket/processed/ -f修改dataset.py用lmdb.Environment直接读取I/O速度提升5倍。去年某公司D同学团队用此法ResNet50训练时间从9.2小时降至2.7小时。5.2 路径二混合精度训练——在P100上榨出V100的性能华为云P100的FP16支持需要手动开启。Baseline默认用FP32显存占用高、速度慢# 在train.py中添加AMP初始化 from torch.cuda.amp import autocast, GradScaler scaler GradScaler() for epoch in range(num_epochs): for x, y in train_loader: optimizer.zero_grad() with autocast(): # 自动混合精度 y_pred model(x) loss criterion(y_pred, y) scaler.scale(loss).backward() # 缩放梯度 scaler.step(optimizer) scaler.update() # 更新缩放因子配合--fp16参数显存占用降40%训练速度升25%。注意scaler.step()后必须跟scaler.update()否则梯度缩放失效。5.3 路径三断点续训的OBS原生方案——告别从头再来Baseline不支持断点续训但华为云提供了原生方案在train.py中每轮保存时增加时间戳torch.save({ epoch: epoch, model_state_dict: model.state_dict(), optimizer_state_dict: optimizer.state_dict(), loss: loss, }, f/cache/checkpoint_epoch_{epoch}.pth) # 同步到OBS file.copy_parallel(/cache/checkpoint_epoch_{}.pth.format(epoch), s3://bucket/checkpoints/checkpoint_epoch_{}.pth.format(epoch))提交新作业时用--resume_urls3://bucket/checkpoints/checkpoint_epoch_5.pth参数在train.py中解析--resume_url用torch.load()加载并恢复epoch和optimizer。这套方案让训练中断后5分钟内即可从断点继续不用重跑前5轮。某高校E同学团队在决赛夜遭遇机房断电靠此方案30分钟内恢复训练最终拿下亚军。6. 我的实战体会Baseline不是终点而是你和华为云对话的语法书跑通Baseline的那一刻你获得的不是一份能交差的代码而是理解华为云AI开发范式的密钥。去年我带的冠军队伍他们在Baseline上只花了8小时剩下72小时全在做三件事第一用OBS的生命周期管理自动清理30天前的output/日志节省存储费用第二把train.py改造成支持--tuning_methodhyperband接入华为云AutoML服务第三用ModelArts的“在线服务”功能把训练好的模型一键部署成API连前端同学都能直接调用。这些能力全部建立在吃透Baseline的Moxing调用、OBS路径规范、日志回传机制之上。所以别把它当“模板”当成一本活的语法书。当你在dataset.py里看到file.list_directory()就该想到OBS的HTTP API调用频率限制当你在config.py里看到--train_url就该意识到这是华为云“存储-计算分离”架构的具象体现当你在日志里看到Syncing output to OBS...就该明白这是平台在帮你做分布式存储的最终一致性保障。最后分享一个细节华为云ModelArts的训练作业其实有个隐藏参数--enable_profilingtrue。开启后它会在OBS生成profiling/目录里面是GPU利用率、内存带宽、PCIe吞吐的火焰图。我建议你在第一次跑通Baseline后

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑