最近,幻方 AI 发布了其沉淀多年的深度学习套件 hfai ,吸引了众多同行研究员和开发者们咨询试用。其中,不少用户朋友对 hfai 中一些功能不太熟悉,使用上存在疑惑,或者仅仅使用了其中非常少的一部分功能。
为此,我们专门创建了 “hfai 使用心法”系列专辑,陆续为大家介绍 hfai 一些功能的设计思路和原理,帮助大家更好更快地习得心法,带着 hfai 这套“神功”游刃有余的应对深度学习作业的各项挑战,举重若轻、例不虚发。
上次文章为大家介绍了 hfai workspace
,其可以帮助用户快速同步本地工程目录代码到远程萤火集群中。但是在实际的作业中,我们还会碰到另外一个问题——如何构建运行环境?这跟上一招式讲到的“本地-萤火,数据通路”其实是一套组合拳,那么本次“心法”就为大家介绍 haienv
,“本地-萤火,环境共享”——快速实现运行环境的集群部署。
使用场景
如上一期文章所介绍的,用户将本地的数据、代码传到远程萤火集群之后,任务代码还需要依赖一些必要的环境才能实际跑起来。然而,集群为了安全起见,采用的是一个封闭的内网系统。
幻方AI经过多年的积累,内部环境已经可以满足很多深度学习训练的需求。使用方式如下,在运行代码的开头加入:
import haienv
haienv.set_env('202111')
import ...
之后,提交任务到萤火集群上运行即可。
然而就特定场景而言,用户难免会依赖一些特殊的环境。那么,用户如何方便地将自定义的环境从本地(个人电脑,个人集群)推到远程集群中部署呢?
haienv create
应运而生,您可以以此构建您自己的运行环境。
命令结构
haienv create <venv_name> [--py <py>] [--no_extend]
以上就是 haienv
命令的格式,其与 conda 创建环境类似, 会生成一个名为 venv_name
的虚拟环境,python 版本号为 <py>
(默认为本地电脑里的 python 版本)。
这里要注意的有两点:
--no_extend
表示不扩展本地环境生成新环境,默认是扩展的。如果不指定--no_extend
那么新创建的环境只可以在本地使用,不能推送到远程。这是因为依赖的基础环境不能被haienv
所捕获。- 在本地使用
hfai init
初始化用户账户信息时,命令里包含了--venv_path
参数,这个参数在萤火集群中是/hf_shared/hfai_envs/
这个路径,在很多用户的本地电脑里基本不会存在。这里如果不指定--venv_path
,可能在venv创建环境时抛出权限问题。这里建议用户在初始化的过程中指定一个存放自己环境的路径,如下所示:
hfai init <token> --venv_path <local_path>
之后,您就可以顺利创建虚拟环境,并通过 haienv list
命令来查看您所创建的虚拟环境了。
环境使用
虚拟环境安装好之后,打开您本地电脑的 ternimal,可以通过如下命令进入该虚拟环境:
source haienv <venv_name>
进入该虚拟环境后,您可以用 pip install
或者 conda install
的方式安装您所需要的依赖。 同时,您也可以人工找到 site-package
的目录并手动导入自己想要的包。以上过程和 python 的流行使用方式一致。
当执行代码时,除了在当前激活的环境下运行,您也可以在项目代码中指定这个虚拟环境。使用非常简单,只需要在主函数代码的最开始引入:
import haienv
haienv.set_env(<venv_name>)
import ...
后续的依赖都会在您所指定的这个虚拟环境中加载。
环境部署
如果您在 hfai Studio 中开发容器里执行的 haienv
创建的虚拟环境,该环境则默认已经部署在集群中。如果您在本地电脑执行的,则需要将环境推送到远程萤火集群进行部署。命令如下:
haienv push <venv_name>
执行该命令时,本地和后台会发生如下交互:
与 hfai workspace
类似,本地与萤火服务层通过 VPN 进行控制交互后,本地环境会先打包发送给OSS,再通过专线导入到萤火集群中。在训练时,模型代码会去搜索加载集群中的这个环境,弹性计算于多个节点中。
这里需要注意的是:
- 与 workspace 不同在于,haienv 只有 push 动作,没有 pull,环境只能单向上传到集群里;
- 在本地执行
haienv
,必须指定--no_extend
参数,环境从零构建;在 Studio 开发容器中执行,则可以不加,从集群默认环境中增量安装
为了您的安装方便,我们建议您在 Studio 开发容器中创建您的虚拟环境。