Skip to content

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基础

基础不牢, 地动山摇, 算法比赛嘛, 起码得有一定的代码基础, 这个代码基础, 主要是指代码的阅读能力, 小部分的代码书写能力即可, 但是这篇博客都不会讲, 如有需要, 可以查阅比如 廖雪峰等的网站, 花半小时到一小时了解基本写法就 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 是一个非常好的学习比赛, 适合大家以赛促学, 基础篇的内容上偏向通用, 对于知识图谱提及的内容也没有再次赘述, 希望可以帮助大家完成赛前的准备, 以一个完美的状态进入比赛中。

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