關于 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