28

NVIDIA Jetson Nano 2GB 系列文章(57):视觉类脚本的环境配置与映射

2GB顶图最新.jpg

在TAO提供的数据类范例中,每个脚本的第一个步骤都是环境配置(0. Set up env variables and map drives),包括要求用户提供在 NGC 所生成的秘钥,对后面训练的模型进行保护,以及指定要使用的 GPU 数量等等,这几个设定都很直观容易处理,但接下去的环境变量配置部分,就让大部分初学者停滞不前,因为任何一项路径配置错误,都会影响后面工作的正常进行,而每个实验脚本所提供的说明,对初学者来的帮助并不大,很多新手按照其字面解释去进行设定,但总是没法调整到完全正确。

因此我们必须在大家执行实验之前,先以专文将这部分的配置说明清楚,然后提供一个最简单的步骤,让大家用最轻松的方法来进行配置。

本文使用范例的 detectnet_v2.ipynb 做示范,首先看一下第一指令块中的设定内容:

import os

%env KEY=tlt_encode
%env NUM_GPUS=1
%env USER_EXPERIMENT_DIR=/workspace/tao-experiments/detectnet_v2
%env DATA_DOWNLOAD_DIR=/workspace/tao-experiments/data

# %env NOTEBOOK_ROOT=~/tao-samples/detectnet_v2
os.environ["LOCAL_PROJECT_DIR"] = FIXME
os.environ["LOCAL_DATA_DIR"] = os.path.join(
    os.getenv("LOCAL_PROJECT_DIR", os.getcwd()),
    "data"
)
os.environ["LOCAL_EXPERIMENT_DIR"] = os.path.join(
    os.getenv("LOCAL_PROJECT_DIR", os.getcwd()),
    "detectnet_v2"
)

# The sample spec files are present in the same path as the downloaded samples.
os.environ["LOCAL_SPECS_DIR"] = os.path.join(
    os.getenv("NOTEBOOK_ROOT", os.getcwd()),
    "specs"
)
%env SPECS_DIR=/workspace/tao-experiments/detectnet_v2/specs

稍微整理一下,除了 KEY 与 NUM_GPUS 两个变量之外,共有 7 个与路径有关的变量:

  • USER_EXPERIMENT_DIR
  • DATA_DOWNLOAD_DIR
  • LOCAL_PROJECT_DIR
  • LOCAL_DATA_DIR
  • LOCAL_EXPERIMENT_DIR
  • LOCAL_SPECS_DIR
  • SPECS_DIR

其实稍微整理一下就更容易理解,下表就是将这 7 个变量分为两组,以“LOCAL_” 开头的属于“容器外”用途,另外 3 个属于容器内用途。

微信截图_20220330155810.png

什么是容器内与容器外?前面提过 TAO 用两套独立的 Docker 容器,分别为视觉类与对话类提供模型训练功能,并透过 TAO 启动器的 CLI 指令执行各项任务。

虽然我们所有操作都在容器外的宿主机上,例如在指令终端下达 “tao detectnet_v2 train ...”, 或者在 Jupyter 交互环境里执行 “!tao detectnet_v2 train ...” 指令,但是 TAO 启动器会将这些指令传递到容器,在后台为我们执行对应的任务。

这种处理方式的最大好处是,让不懂 Docker 的初学者完全无需理会容器技术,只要专注于“模型训练”的重点工作就行,如此就能让 TAO 的普及程度更快与更广,这也是 TAO 工具的一项非常重要意义。

但为何需要使用两套路径来处理呢?全部都在容器内执行不是更加简单?这里有个最严肃的问题是“容器的生命周期”,如果将数据保留在容器内处理的话,一旦容器关闭或销毁时,我们所有实验数据都将付之一炬,这是一项大家都承担不起的风险,因此我们必须将所有的数据存放在容器外面,然后透过路径映射 (mapping) 的方式来处理。

其次就是对于数据整理与文件修改的能力,在容器内操作是相对不方便的。要知道在执行模型训练之前,通常得先下载数据集的压缩文件、移动文件、进行解压缩、修改配置文件等等,这些任务在宿主机上操作是相对轻松的。

好了,当我们清楚 TAO 的视觉类模型训练脚本中,存在容器内与容器外两组环境路径的原因之后,接着就来看该如何设置与映射。

我们将前面的列表进行展开,前面 4 个是容器外的变量、后面 3 个是容器内变量:

微信截图_20220330155827.png

假如在执行格内的变量按照上表的顺序去排列,事情就会变得非常单纯。

事实上,从头到尾我们只要将 “LOCAL_PROJECT_DIR” 设置为”执行脚本所在目录”,那么后面三个容器外变量就立即建立好对应关系,我们完全不需要做任何处理理会。至于容器内的三个变量,每个脚本的配置规则都是一样,也就是不需要去改变。

把上面的对应关系了解清楚之后,整个状况就变得非常简单,现在回头看看第一个指令块,里面需要输入的变量其实只有以下三个:

  • %env KEY= <自己在NGC上申请的秘钥>
  • %env NUM_GPUS= <根据设备配置,给定调用的GPU数量>
  • os.environ["LOCAL_PROJECT_DIR"] = os.getcwd()

其他6个变量完全不做任何修改,这样就能够顺畅地跑动后面的指令块。
接下去的工作就是执行“路径映射”任务,为容器内外的路径建立对应的关系。几乎所有训练脚本都采用下面的映射方式:

[  ]    # Define the dictionary with the mapped drives
drive_map = {
    "Mounts": [
        # Mapping the data directory
        {
            "source": os.environ["LOCAL_PROJECT_DIR"],
            "destination": "/workspace/tao-experiments"
        },
        # Mapping the specs directory.
        {
            "source": os.environ["LOCAL_SPECS_DIR"],
            "destination": os.environ["SPECS_DIR"]
        },
    ]
}

执行这个路径映射的指令块之后,会将这些值写入 “~/.tao_mounts.json” 文件里面,这是TAO启动器每次调用容器时都需要参考的配置文件,但是这个文件是“唯一”的,也就是同一时间只会存在一组容器内外的路径映射关系,这表示系统不能同时执行两个以上的模型训练脚本,这点也请务必牢记。

紧跟着的 “1. Install the TAO launcher” 步骤可以直接跳过,因为我们在前面已经带着大家安装好TAO启动器,这里顶多执行 “!tao info” 指令,确认一下是否回应正确讯息。

现在就可以开始进行 TAO 所提供的各种神经网络的模型训练脚本。

2GB底图最新.jpg

推荐阅读
关注数
7028
内容数
61
深耕嵌入式 AI 计算,助力自主机器研发
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息