人工智能/深度学习

Sky Hackthon 比赛指北 – 基础篇

关于 Sky Hackthon

Sky Hackthon 比赛是由 Nvidia 中国开发者社区举办的,面向国内高校学生的关于算法模型应用比赛,比赛期间,同学将用两周时间实现一个官方指定主题的算法功能,并将其部署到指定的云端平台上。

比赛主题一般是与生活息息相关内容,例如第六届比赛是一个 AI大白,第七届比赛是一个垃圾检测网站。

我认为 Sky Hackthon 是一个团队学习型比赛,比赛期间全程由导师尽心指导,凡有所问,必有所答,如果团队间尽力合作,虚心求教,最低能达成完赛要求,最高直接领奖!

作为一个学习型比赛,可以向导师学习、向其他团队学习、团队间学习等等,可以说,从完全不会的 0 基础小白,到基本熟悉 Linux 操作,学会算法模型训练与部署,就缺这么一场竞赛。

关于本系列

本人参加第六届、第七届Sky Hackthon比赛均获得第一名,对 Sky Hackthon 比赛了解还算足够,考虑到还欠Lady一篇博客,以及还有最新的打卡活动,我决定在隔离期间写一个系列片,为 Sky Hackthon 后续的比赛添砖加瓦 (增加难度)。

本系列共分五篇,分别是:

  • 基础篇:介绍参加 Sky Hackthon 应该拥有的基础,或者赛前准备应该做哪些努力
  • ASR篇:介绍关于比赛中 ASR 模型的训练、处理,以及如何保证在 ASR 部分拿到应该拿的分数。
  • TTS篇: 介绍关于比赛中 TTS 模型的训练、处理,以及如何训练一个相对完美的 TTS 结果。
  • CV篇:可能是最为复杂的一篇,介绍 CV 模型的选择、训练、处理,以及如何部署。
  • Web篇:根据第七届比赛临时添加的内容,考虑到后续比赛依然可能存在 Web 界面,故加此篇。

最后,不代表读了,你就一定能拿到好成绩,但是我希望这个系列,让你尽可能的少走弯路错路,最后比赛的成功,你依然需要付出大量时间、精力、不耻下问和团队彼此的竭力合作。

最后的最后,这个比赛的重点,并不在于最后的名次,而是相较于比赛前,你学到了、了解到了什么更有用的知识,不必为了名次与奖励而太过紧张与焦虑。

回到小学做一个满分的卷子并不能被叫做一场成功的考试

但是参加未曾尝试过的比赛并且完赛,我觉得可以称之为成功的参赛。

正式开始

基础篇共有以下内容:

  • Python基础
  • Linux基础
  • NGC
  • 环境准备与安装

Python基础

基础不牢,地动山摇,算法比赛嘛,起码得有一定的代码基础,这个代码基础,主要是指代码的阅读能力,小部分的代码书写能力即可,但是这篇博客都不会讲,如有需要,可以查阅比如 廖雪峰等的网站,花半小时到一小时了解基本写法就 OK,保证看到代码不会懵逼, 剩下的可以交给实战。

在 Python 基础部分,重点讲有两个,一个是虚拟环境,另外一个是环境变量。

关于虚拟环境:

代码的编译与运行需要指定的环境,比如 Java 需要对应版本的 JDK、JRE,JS代码用浏览器可以运行一样, Python 也有自己的环境,所以想要运行一个Python 程序,就首先应该确定他的 Python版本、所运行的包版本。

但是存在一个问题,如何管理不同程序之间的 版本 呢?

难道每次使用不同的程序都需要重新进行卸载和安装吗? 当然不必。

Python 自3.3之后,提供了一个新的特性 虚拟环境, 顾名思义,这是一个完全虚拟的环境,我们可以自行指定其 Python 版本,指定环境内的包版本。

# 创建一个虚拟环境 名为 myVenv
python3 -m venv myVenv 
# 激活(或者理解成切换到)指定的虚拟环境
source myVenv/bin/active

而之后,也产生了非常多的虚拟环境管理器,比如最常用的: Anaconda。

通过 Conda,我们可以创建一个独立的虚拟环境,他与实际的环境完全隔离,如果出现任何问题,我们都可以卸载环境,重新再次安装。

# 创建虚拟环境,名为 myVenv 并指定虚拟环境版本为3.6.9
conda create -n myVenv python==3.6.9
# 激活虚拟环境
conda activate myVenv
# 退出虚拟环境
conda deactivate myVenv

管理好虚拟环境,就能正确的管理你的 Python 代码,在进行相关操作时候(涉及环境变化),就能理解操作的含义。

除虚拟环境之外的另外一个重点,则是,环境变量:

在 Python 中。你可以使用 os 包进行环境变脸的设置,比如:

# 设置一个名字为 Test, 值为 testValue 的环境变量
os.environ["Test"]="testValue"

然后,使用 os 包重新调用对应的变量:

print(os.environ['Test'])

注意,这一环境变量并非仅存于虚拟环境中,而是设置于系统之中,通过设置环境变量,我们可以很轻易的调用一些变量,而不必关注变量此刻的值。

特别注意:

  • 代码规范:虽然 Python 本身是强缩进的,但是这不代表没有规范,一定要保证代码的可读性,实在不行,多写一点注释,方便遇到问题的时候进行 Debug。
  • 环境管理:不同的程序可以考虑单独一个虚拟环境,在进行程序安装的时候请务必注意安装进了哪个环境。

Linux基础

不管之前是否有 Windows 系统操作的习惯, Sky Hackthon 比赛最终的部署环境说位于 Jetson Nano 或者 NX 上的,默认系统应该是 Ubuntu 18.04,也就是没有 Linux 的操作基础,注定只能看着干瞪眼。

所以 Linux 基础,主要讲解一些基础的概念和指令。

概念相关:

  • 家路径: 通常指 /home/xxx 其中 xxx 指登陆的这个用户名,比如 Ubuntu 默认用户是 Ubuntu,可以使用 ~ 进行指代。如果是 root 用户,则家目录为 /root。
  • 根路径: 指路径的根,其实就是 / ,这是 Linux 系统中最大的文件夹,所有的文件都在这个文件夹下面。
  • 当前路径: 指当前所在的文件夹,可以使用 . 来表示。
  • 上级路径: 指当前文件夹外层的文件夹,使用 .. 来表示。
  • 提权:指提高权限,通常是由普通用户提高成为 root 用户,来完成一些普通用户无法完成的指令。

指令相关(详细的使用介绍我建议再自行百度一次):

  • cd::进入指定的路径,例如:·cd /user,进入根目录下 user 文件夹。
  • ls:展示当前文件夹下全部文件夹信息
  • sudo::提权后执行命令,例如 sudo run.sh,指提权后使用 root 的权限执行 run.sh的脚本
  • chmod:修改权限,修改执行一个文件所需要的权限,具体请百度详情,通常搭配 sudo 使用。
  • bash: 执行脚本,需要拥有脚本的执行权限才可执行,但是是在 子Shell 内执行的。
  • export::设置环境变量,通常需要搭配 source 指令才能生效。
  • source:执行脚本,但是位于当前 Shell 中执行,通常是执行 source profile 使得设置的环境变量生效。
  • weget:执行一个网络的 get 请求,默认情况下会直接下载请求来的网络文件。
  • curl: 是一个网络下载工具,默认情况会将内容展示在屏幕上,但是通过参数也可也进行下载操作。
  • kill: 关闭进程,通常搭配参数 -9 或者 -15 进行程序关闭。
  • rm:删除指定的文件,建议详细百度该命令,避免犯错,经典笑话之一:rm -rf /*
  • cp:移动指定文件,通常建议使用该命令代替 rm命令。
  • |:被称为通道命令,简单的来讲,是讲通道前的命令得到的输出,作为下一个命令的输入去执行。

注意:这里有很多命令还没有提到,遇到需求请自行结合百度。

特殊注意:

  • 一切在你:在我初学 Linux 系统时,了解到的第一句话是: Linux 系统会默认你知道你所执行的指令会发生什么,所以你应该为你做的一切操作负责。所以你操作请务必小心。
  • 滥用权限一:不应该滥用 sudo,除非机器是临时使用,或者是无任何安全需求,降低使用 sudo 直接执行命令的习惯。改为 sudo 搭配 chmod 进行权限修改,然后再执行脚本。
  • 滥用权限二:不应该滥用 chmod,权限并非只有 777 一个,请合理的设置权限,保证当前用户可以执行足以。
  • 滥用权限三:kill 命令不是只有 -9 一个选择,除非确定无碍,否则尽量不要使用 -9, 使用 -15更好。具体区别自行百度。
  • 移动代替删除:删除之后文件往往很难甚至不可能恢复,所以应该尽可能少的使用 rm 指令,尽可能多的只用 mv 指令,以免在某些操作之后难以进行回档。磁盘的价格,往往低于丢失文件造成的损失。

NGC

NGC:Nintendo GameCube,任天堂家用游戏机,当然是不可能的, 其实全称应该是 Nvidia GPU Cloud,根据其官方页面介绍:
NVIDIA NGC™ 提供一系列完全托管的云服务,包括用于 NLU 和语音 AI 解决方案的 NeMo LLM、BioNemo 和 Riva Studio。AI 从业者可以利用 NVIDIA Base Command 进行模型训练,利用 NVIDIA Fleet Command 进行模型管理,并利用 NGC 专用注册表安全共享专有 AI 软件。此外,NGC 还拥有一个 GPU 优化的 AI 软件、SDK 和 Jupyter Notebook 的目录,可帮助加速 AI 工作流,并通过 NVIDIA AI Enterprise 提供支持。

由于比赛会使用 Nemo、Tao 等工具,所以我们需要预先在这里进行注册账号,注册完账号后,可以进行模型下载等操作。

具体操作内容,可以看赛前发放的 黑客松知识图谱,完全够用。

环境准备与安装

具体的安装过程,其实在 黑客松知识图谱内均有讲解,这里不会过多叙述,这里更偏向于,如何准备一个可以用以训练的环境。
主要分为三个部分:

  • 硬件环境
  • 容器
  • 队友

硬件环境

根据我所了解的情况,我以大家拥有的硬件情况分为以下几类:

拥有 NX 或者 Nano:
– 不论是个人亦或者实验室拥有,均可以直接刷指定系统,然后开跑就完事了,可以在自己的或者课题室的服务器上训练好模型,进行部署测试,到最后直接迁移就可以啦,可以说是最好的情况。
没有 NX 或者 Nano,但是实验室有可以使用的 GPU:
– 由于服务器通常使用 Linux 系统,所以可以使用实验室 GPU 来训练比赛所需模型,需要根据 黑客松知识图谱进行安装准备,在这里,务必注意:安装所处虚拟环境,和执行命令权限,不要影响到服务器上的其他同学。 然后可以在本地电脑上进行部署测试,为比赛结束的时候的部署进行准备,对可能的突发情况做到小有准备,提高成功率。
没有实验室 GPU 支持,拥有个人 GPU, 具有较强的动手能力:
– 这里可以尝试安装双系统,或者使用 WSL 进行虚拟环境,然后来进行模型训练,但折腾双系统会有较大的问题,会遇到种种意外情况,所以推荐百折不挠的同学尝试,如果基础比较薄弱,然后动手能力不足的话,推荐放弃该方案。
没有个人 GPU,或动手能力尚浅的同学:
– 使用云GPU,比如 AutoDL、Featurize 等平台,前者价格便宜,后者分配的是物理机,支持 docker,两者各有优劣,除此之外还有其他很多 GPU 平台,欢迎大家自己搜索使用。云端 GPU 的好处是,随用随开,不需要费力折腾,有问题实在解决不了也恢复不了,那就就换个机子。

大家应该在赛前对硬件环境有一定的准备,并且尽量完成环境的安装,保证开赛后可以及时的投入到比赛过程中去。

容器

这个放在这里单独提出,其实主要是想讲两个问题,第一个是云 GPU 带来的容器使用问题,第二个则是容器的路径问题。

由于 TAO 会使用 docker,所以在某种意义上,docker 是必不可少的,而 云 GPU 服务商提供给用户的,往往就已经是一个 docker,所以并不一定能在内部安装 docker,这样的话在云 GPU 选择上,应该慎重。建议购买前找客服询问清楚。

第二个问题,容器可以简单理解成一个虚拟机,它可以像虚拟机一样,将外部宿主机的某个文件夹挂载到容器的内部,这样修改外部文件,容器内部的文件也会随时更改。这时候,一定要区分好宿主机路径和容器内路径。

队友

队友是必不可少的一环,因为训练会分为2-3个模型,还有额外的任务,五个人必须要分工合作,训练模型包括了数据准备、清理、标注,训练和部署也需要反复测试验证,所以多一个人少一个人工作量并不相同,如果有人没干活,那就得有人更全心的投入。

当然,这并不是说我们应该责怪队友不付出,而是讲我们应该时刻关注彼此的工作进度,加强团队分工和团队沟通,相互帮忙完成任务,避免个人突发情况不能持续投入时导致的进度问题,这能大大的提高比赛完成的成功率。

结语

Sky Hackthon 是一个非常好的学习比赛,适合大家以赛促学,基础篇的内容上偏向通用,对于知识图谱提及的内容也没有再次赘述,希望可以帮助大家完成赛前的准备,以一个完美的状态进入比赛中。

当然你就算不准备,只要比赛的时候认真努力,完赛还是没问题的,导师们真的会很耐心的指导大家,解决大家的问题。

原文链接:https://blog.csdn.net/qq_36630208/article/details/128104922

Tags