华为云AI开发平台ModelArts上传数据和算法至SFS(首次使用时需要)_云淘科技

前提条件

ECS服务器已挂载SFS,请参考ECS服务器挂载SFS Turbo存储。
已经创建好,请参考在ECS中创建ma-user和ma-group。
已经安装obsutil,请参考下载和安装obsutil。

准备数据类似

登陆coco数据集下载官网地址:https://cocodataset.org/#download
下载coco2017数据集的Train(18GB)、Val images(1GB)、Train/Val annotations(241MB),分别解压后并放入coco文件夹中。
下载完成后,将数据上传至SFS相应目录中。由于数据集过大,推荐先通过obsutil工具将数据集传到OBS桶后,再将数据集迁移至SFS。

在本机机器上运行,通过obsutil工具将本地数据集传到OBS桶。

# 将本地数据传至OBS中
# ./obsutil cp ${数据集所在的本地文件夹路径} ${存放数据集的obs文件夹路径} -f -r
# 例如
./obsutil cp ./coco obs://your_bucket/ -f -r

登录ECS服务器,通过obsutil工具将数据集迁移至SFS,样例代码如下:

# 将OBS数据传至SFS中
# ./obsutil cp ${数据集所在的obs文件夹路径} ${SFS文件夹路径} -f -r
# 例如
./obsutil cp obs://your_bucket/coco/ /mnt/sfs_turbo/ -f -r

/mnt/sfs_turbo/coco文件夹内目录结构如下:

coco
|---annotations
|---train2017
|---val2017

更多obsutil的操作,可参考obsutil简介。

将文件设置归属为ma-user

chown -R ma-user:ma-group coco

代码云上适配

下载YOLOX代码。代码仓地址:https://github.com/Megvii-BaseDetection/YOLOX.git。

git clone https://github.com/Megvii-BaseDetection/YOLOX.git
cd YOLOX
git checkout 4f8f1d79c8b8e530495b5f183280bab99869e845

修改requirements.txt中的onnx版本,改为:onnx>=1.12.0。
修改yolox/data/datasets/coco.py line59: data_dir = os.path.join(get_yolox_datadir(), “COCO”) –>data_dir = ‘/home/ma-user/coco’。

# data_dir = os.path.join(get_yolox_datadir(), "COCO")
data_dir = '/home/ma-user/coco'

在tools/train.py的第13行前加两句代码:

# 加上这两句代码,防止运行时找不到yolox module
import sys
sys.path.append(os.getcwd())

# line13
from yolox.core import launch
from yolox.exp import Exp, get_exp

yolox/layers/jit_ops.py 第122行 fast_cocoeval改为fast_coco_eval_api

# def __init__(self, name="fast_cocoeval"):
def __init__(self, name="fast_coco_eval_api"):

yolox\evaluators\coco_evaluator.py 第294行 from yolox.layers import COCOeval_opt as COCOeval 改为from pycocotools.cocoeval import COCOeval

try:
   # from yolox.layers import COCOeval_opt as COCOeval
   from pycocotools.cocoeval import COCOeval
except ImportError:
   from pycocotools.cocoeval import COCOeval

   logger.warning("Use standard COCOeval.")

在tools目录下新建一个run.sh作为启动脚本,run.sh内容可参考:

#!/usr/bin/env sh
set -x
set -o pipefail

export NCCL_DEBUG=INFO

DEFAULT_ONE_GPU_BATCH_SIZE=32
BATCH_SIZE=$((${MA_NUM_GPUS:-8} * ${VC_WORKER_NUM:-1} * ${DEFAULT_ONE_GPU_BATCH_SIZE}))
if [ ${VC_WORKER_HOSTS} ];then
    YOLOX_DIST_URL=tcp://$(echo ${VC_WORKER_HOSTS} | cut -d "," -f 1):6666
    /home/ma-user/anaconda3/envs/pytorch/bin/python -u tools/train.py \
                                -n yolox-s \
                                --devices ${MA_NUM_GPUS:-8} \
                                --batch-size ${BATCH_SIZE} \
                                --fp16 \
                                --occupy \
                                --num_machines ${VC_WORKER_NUM:-1} \
                                --machine_rank ${VC_TASK_INDEX:-0} \
                                --dist-url ${YOLOX_DIST_URL}
else
    /home/ma-user/anaconda3/envs/pytorch/bin/python -u tools/train.py \
                                -n yolox-s \
                                --devices ${MA_NUM_GPUS:-8} \
                                --batch-size ${BATCH_SIZE} \
                                --fp16 \
                                --occupy \
                                --num_machines ${VC_WORKER_NUM:-1} \
                                --machine_rank ${VC_TASK_INDEX:-0}
fi

部分环境变量在Notebook环境中不存在,因此需要提供默认值。

将代码放到OBS上,然后通过OBS将代码传至SFS相应目录中。

在本机机器上运行,通过obsutil工具将本地数据集传到OBS桶。

# 将本地代码传至OBS中
./obsutil cp ./YOLOX obs://your_bucket/ -f -r

登录ECS服务器,通过obsutil工具将数据集迁移至SFS,样例代码如下:

# 将OBS的代码传到SFS中
./obsutil cp obs://your_bucket/YOLOX/ /mnt/sfs_turbo/code/ -f -r

本案例中以obsutils方式上传文件,除此之外也可通过SCP方式上传文件,具体操作步骤可参考本地Linux主机使用SCP上传文件到Linux云服务器。

在SFS中将文件设置归属为ma-user

chown -R ma-user:ma-group YOLOX

执行以下命令,去除Shell脚本的\r字符。

cd YOLOX
sed -i 's/\r//' run.sh

Shell脚本在Windows系统编写时,每行结尾是\r
,而在Linux系统中行每行结尾是
,所以在Linux系统中运行脚本时,会认为\r是一个字符,导致运行报错“$’\r’: command not found”,因此需要去除Shell脚本的\r字符。

父主题: 单机多卡

同意关联代理商云淘科技,购买华为云产品更优惠(QQ 78315851)

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家