化學(xué)習(xí)環(huán)境搭建全指南)
1. 項(xiàng)目概述為什么Unity ML-Agents值得你投入時(shí)間如果你是一名Unity開(kāi)發(fā)者或者對(duì)游戲AI、智能體訓(xùn)練感興趣那么“安裝Unity ML-Agents Toolkit”這個(gè)標(biāo)題背后遠(yuǎn)不止是敲幾行命令那么簡(jiǎn)單。它代表著你將游戲或仿真環(huán)境從一個(gè)靜態(tài)的、腳本驅(qū)動(dòng)的世界轉(zhuǎn)變?yōu)橐粋€(gè)能夠自主學(xué)習(xí)和進(jìn)化的智能系統(tǒng)試驗(yàn)場(chǎng)。ML-Agents是Unity官方推出的開(kāi)源工具包它架起了游戲引擎與前沿機(jī)器學(xué)習(xí)特別是深度強(qiáng)化學(xué)習(xí)之間的橋梁。簡(jiǎn)單來(lái)說(shuō)它允許你用Python寫訓(xùn)練算法在Unity構(gòu)建的豐富3D/2D環(huán)境中訓(xùn)練“智能體”Agent最終將這個(gè)學(xué)會(huì)了特定技能的智能體“大腦”模型放回Unity中運(yùn)行。這解決了什么問(wèn)題傳統(tǒng)游戲AI無(wú)論是有限狀態(tài)機(jī)還是行為樹都需要開(kāi)發(fā)者預(yù)設(shè)所有規(guī)則和反應(yīng)復(fù)雜且僵硬。而通過(guò)ML-Agents你可以讓AI通過(guò)試錯(cuò)自己學(xué)會(huì)走路、戰(zhàn)斗、合作甚至制定策略創(chuàng)造出更靈活、更智能、甚至能帶來(lái)意外驚喜的NPC行為。它同樣適用于機(jī)器人仿真、自動(dòng)駕駛模擬、工業(yè)流程優(yōu)化等非游戲領(lǐng)域。無(wú)論你是想為你的獨(dú)立游戲注入靈魂還是作為研究者需要一個(gè)強(qiáng)大的仿真平臺(tái)安裝并跑通ML-Agents都是通往這個(gè)新世界的第一步。這個(gè)過(guò)程會(huì)涉及Unity編輯器、Python環(huán)境、PyTorch以及兩者間的通信雖然步驟清晰但細(xì)節(jié)處的“坑”不少這也是我寫這篇詳細(xì)指南的原因——幫你把路趟平。2. 環(huán)境準(zhǔn)備與核心組件解析在真正動(dòng)手安裝之前我們必須理解ML-Agents Toolkit的架構(gòu)。它不是單一軟件而是一個(gè)由幾個(gè)核心部分協(xié)同工作的系統(tǒng)。理解它們后續(xù)的安裝和問(wèn)題排查才會(huì)有的放矢。2.1 核心組件構(gòu)成與作用ML-Agents主要包含兩大塊Unity側(cè)SDK和Python側(cè)訓(xùn)練端。Unity Package (com.unity.ml-agents)這是一個(gè)Unity的包Package通過(guò)Package Manager安裝到你的Unity項(xiàng)目中。它提供了所有在Unity內(nèi)部運(yùn)行所需的基礎(chǔ)設(shè)施Agent組件你需要掛載在GameObject上的核心腳本定義了智能體的觀測(cè)Observations、行動(dòng)Actions、獎(jiǎng)勵(lì)Rewards等。行為參數(shù)Behavior Parameters指定智能體使用哪個(gè)訓(xùn)練好的模型文件.nn文件進(jìn)行推理或者連接到Python端進(jìn)行訓(xùn)練。Academy環(huán)境的管理者控制環(huán)境的重置、幀率等全局設(shè)置。傳感器Sensors用于收集環(huán)境信息如攝像頭視覺(jué)、射線檢測(cè)等作為觀測(cè)輸入。Side Channels用于Unity和Python之間傳遞額外信息如調(diào)試參數(shù)、課程學(xué)習(xí)配置的通信通道。Python 訓(xùn)練包 (mlagents)這是一個(gè)通過(guò)pip安裝的Python包。它包含了訓(xùn)練算法如PPO、SAC、MA-POCA等強(qiáng)化學(xué)習(xí)算法的PyTorch實(shí)現(xiàn)。命令行工具核心是mlagents-learn命令用于啟動(dòng)訓(xùn)練。Python API允許你以編程方式與Unity環(huán)境交互方便自定義訓(xùn)練循環(huán)或研究。通信層Unity環(huán)境作為“環(huán)境”和Python訓(xùn)練進(jìn)程作為“大腦”之間通過(guò)一個(gè)gRPCGoogle Remote Procedure Call端口進(jìn)行通信。Unity環(huán)境啟動(dòng)一個(gè)“游戲”實(shí)例等待Python端連接并發(fā)送指令。注意從ML-Agents Release 18對(duì)應(yīng)Unity Package 2.0之后架構(gòu)進(jìn)行了重大簡(jiǎn)化。以前復(fù)雜的ml-agents、ml-agents-envs等獨(dú)立Python包現(xiàn)在都整合進(jìn)了單一的mlagentsPyTorch包。務(wù)必確認(rèn)你查閱的教程是針對(duì)新版本1.0.0的否則步驟會(huì)完全不同。2.2 系統(tǒng)與軟件版本匹配避坑第一步版本不匹配是安裝失敗的頭號(hào)殺手。ML-Agents對(duì)Unity、Python和PyTorch的版本有特定要求。根據(jù)官方最新文檔以Release 23為例我推薦以下經(jīng)過(guò)驗(yàn)證的組合組件推薦版本說(shuō)明與注意事項(xiàng)Unity Editor2022.3 LTS或2021.3 LTS長(zhǎng)期支持版最穩(wěn)定。必須使用64位版本。Unity 2020.1也支持但2022.3是當(dāng)前最均衡的選擇。Python3.8.0 至 3.10.x強(qiáng)烈推薦Python 3.8或3.9。Python 3.11及更高版本可能存在未知的第三方庫(kù)兼容性問(wèn)題。請(qǐng)避免使用系統(tǒng)自帶的Python建議使用Miniconda或直接安裝官方Python。PyTorch1.8.1, 2.0.0ML-Agents的mlagents包依賴于特定版本的PyTorch。安裝mlagents時(shí)會(huì)自動(dòng)安裝兼容的PyTorch但如果你已有PyTorch環(huán)境需注意版本沖突。ML-Agents Unity PackageRelease 23 (4.0.0)通過(guò)Unity Package Manager安裝。這是本文基于的最新穩(wěn)定版。ML-Agents Python包 (mlagents)1.1.0與Unity Package 4.0.0配套。使用pip install mlagents安裝。實(shí)操心得我強(qiáng)烈建議使用Miniconda來(lái)管理Python環(huán)境。這能完美解決多個(gè)項(xiàng)目間Python包版本沖突的問(wèn)題。為ML-Agents創(chuàng)建一個(gè)獨(dú)立的Conda環(huán)境是保持系統(tǒng)清潔、避免“依賴地獄”的最佳實(shí)踐。3. 分步安裝實(shí)操全流程接下來(lái)我們按照邏輯順序一步步完成所有組件的安裝和配置。3.1 步驟一創(chuàng)建并配置獨(dú)立的Python環(huán)境打開(kāi)終端Windows用CMD或PowerShellmacOS/Linux用Terminal。安裝Miniconda如果尚未安裝去Miniconda官網(wǎng)下載對(duì)應(yīng)你操作系統(tǒng)的安裝包并安裝。安裝時(shí)注意勾選“Add Miniconda to my PATH environment variable”Windows或按照提示在Shell配置文件中初始化。創(chuàng)建新的Conda環(huán)境# 創(chuàng)建一個(gè)名為mlagents可自定義的Python 3.9環(huán)境 conda create -n mlagents python3.9輸入y確認(rèn)。激活該環(huán)境# Windows conda activate mlagents # macOS/Linux conda activate mlagents激活后命令行提示符前通常會(huì)顯示(mlagents)表示你已進(jìn)入該獨(dú)立環(huán)境。3.2 步驟二安裝Python端的ML-Agents包在激活的(mlagents)環(huán)境中執(zhí)行安裝命令。這里有幾個(gè)關(guān)鍵點(diǎn)基礎(chǔ)安裝最簡(jiǎn)單的命令是直接安裝mlagents。它會(huì)自動(dòng)處理PyTorch等核心依賴。pip install mlagents安裝特定版本為了與Unity Package 4.0.0精確匹配可以指定版本。pip install mlagents1.1.0驗(yàn)證安裝安裝完成后運(yùn)行以下命令檢查是否成功并查看版本。mlagents-learn --help如果成功你會(huì)看到mlagents-learn命令的使用說(shuō)明。你也可以通過(guò)pip show mlagents查看詳細(xì)版本信息。注意事項(xiàng)網(wǎng)絡(luò)問(wèn)題如果下載緩慢或超時(shí)請(qǐng)使用國(guó)內(nèi)鏡像源例如清華源pip install mlagents -i https://pypi.tuna.tsinghua.edu.cn/simple權(quán)限問(wèn)題在macOS/Linux上如果遇到權(quán)限錯(cuò)誤切勿使用sudo pip install。這會(huì)將包安裝到系統(tǒng)Python造成混亂。堅(jiān)持在Conda虛擬環(huán)境中操作即可。PyTorch CUDA支持如果你的機(jī)器有NVIDIA GPU并已安裝CUDAmlagents包默認(rèn)安裝的是CPU版本的PyTorch。如果你想利用GPU加速訓(xùn)練對(duì)于復(fù)雜環(huán)境至關(guān)重要需要在安裝mlagents后根據(jù)你的CUDA版本去PyTorch官網(wǎng)獲取命令重新安裝對(duì)應(yīng)CUDA版本的PyTorch。例如對(duì)于CUDA 11.8pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118安裝后在Python中運(yùn)行import torch; print(torch.cuda.is_available())應(yīng)返回True。3.3 步驟三在Unity中安裝ML-Agents Package現(xiàn)在轉(zhuǎn)向Unity部分。創(chuàng)建或打開(kāi)一個(gè)Unity項(xiàng)目建議為學(xué)習(xí)ML-Agents創(chuàng)建一個(gè)全新的空項(xiàng)目3D Core模板即可避免與現(xiàn)有項(xiàng)目插件沖突。打開(kāi)Package ManagerWindow-Package Manager。添加官方Registry如果列表中沒(méi)有點(diǎn)擊左上角號(hào)選擇Add package from git URL...。對(duì)于最新版輸入com.unity.ml-agents。Unity會(huì)自動(dòng)從官方Registry查找。更可靠的方式是點(diǎn)擊Package Manager窗口左上角的齒輪圖標(biāo)選擇Advanced Project Settings在Scoped Registries中添加Unity的官方注冊(cè)表通常新項(xiàng)目已默認(rèn)配置。安裝Package在Package Manager中將左上角的下拉菜單從Packages: In Project切換到Packages: Unity Registry。在搜索框中輸入“ml-agents”。找到ML-Agents開(kāi)發(fā)者是Unity Technologies點(diǎn)擊右側(cè)的Install按鈕。驗(yàn)證Unity側(cè)安裝安裝完成后在Unity編輯器的菜單欄中你應(yīng)該能看到Window-ML-Agents的子菜單。同時(shí)在GameObject的Component菜單中也能找到ML Agents相關(guān)的組件如Behavior Parameters和Decision Requester。3.4 步驟四運(yùn)行第一個(gè)示例驗(yàn)證安裝理論安裝完成必須用實(shí)際運(yùn)行來(lái)驗(yàn)證。官方包內(nèi)置了豐富的示例場(chǎng)景是最好的測(cè)試材料。導(dǎo)入示例在Package Manager中找到已安裝的ML-Agents包在右側(cè)詳情頁(yè)點(diǎn)擊Import Samples下的Import按鈕導(dǎo)入Example Environments。打開(kāi)示例場(chǎng)景導(dǎo)入后在項(xiàng)目的Assets/Samples/ML-Agents/version/Example Environments/Scenes/路徑下找到3DBall場(chǎng)景并雙擊打開(kāi)。這是一個(gè)經(jīng)典的平衡球示例目標(biāo)是通過(guò)控制平板讓球不掉落。配置場(chǎng)景以進(jìn)行訓(xùn)練在Hierarchy中找到Ball3DAcademy或Ball3D相關(guān)的GameObject。選中包含Behavior Parameters組件的智能體通常是Ball3D本身或其子物體。在Inspector面板的Behavior Parameters組件中將Behavior Type設(shè)置為Default。這意味著它將接受外部Python訓(xùn)練器的控制。確保Decision Requester組件存在且Decision Period大于0如5。構(gòu)建可執(zhí)行文件Build這是關(guān)鍵一步。Python的mlagents-learn命令無(wú)法直接操作Unity編輯器它需要連接一個(gè)編譯后的Unity可執(zhí)行文件。File-Build Settings。將當(dāng)前場(chǎng)景3DBall拖入Scenes In Build列表。選擇目標(biāo)平臺(tái)如Windows, macOS, Linux Standalone。為了測(cè)試建議先選擇與你開(kāi)發(fā)機(jī)相同的平臺(tái)。在Player SettingsBuild Settings窗口左下角中確保Run In Background是勾選的這樣Unity應(yīng)用在非焦點(diǎn)時(shí)也能繼續(xù)運(yùn)行。點(diǎn)擊Build選擇一個(gè)空文件夾例如在項(xiàng)目根目錄創(chuàng)建Builds文件夾并為可執(zhí)行文件命名如3DBall。等待編譯完成。啟動(dòng)訓(xùn)練打開(kāi)終端確保你的Conda環(huán)境mlagents是激活狀態(tài)。使用cd命令導(dǎo)航到你存放剛才構(gòu)建的可執(zhí)行文件的目錄。運(yùn)行訓(xùn)練命令mlagents-learn config_path --run-idfirstRun --envpath_to_your_build這里需要替換兩個(gè)參數(shù)config_path訓(xùn)練配置文件的路徑。示例配置文件在Assets/Samples/ML-Agents/version/Example Environments/Config/里對(duì)于3DBall可以使用trainer_config.yaml但更簡(jiǎn)單的方法是使用ML-Agents內(nèi)置的默認(rèn)PPO配置直接指定示例自帶的配置文件例如你需要找到該yaml文件的實(shí)際路徑。path_to_your_build你剛才構(gòu)建的可執(zhí)行文件的完整路徑包括文件名如./Builds/3DBall.exe或./Builds/3DBall.app。 一個(gè)具體的例子假設(shè)在構(gòu)建目錄下運(yùn)行且使用默認(rèn)配置可能是mlagents-learn ../Assets/Samples/ML-Agents/4.0.0/Example Environments/Config/3DBall.yaml --run-idmyFirstBallRun --env./3DBall.exe命令執(zhí)行后終端會(huì)顯示“Start training by pressing the Play button in the Unity Editor.”但因?yàn)槲覀冇昧?-env參數(shù)指向構(gòu)建版所以不需要點(diǎn)擊Unity編輯器的Play按鈕。直接等待構(gòu)建的可執(zhí)行文件自動(dòng)啟動(dòng)。觀察訓(xùn)練過(guò)程Unity可執(zhí)行文件會(huì)啟動(dòng)并出現(xiàn)多個(gè)默認(rèn)3個(gè)相同的3DBall環(huán)境窗口。同時(shí)終端會(huì)開(kāi)始輸出訓(xùn)練日志包括每一步的獎(jiǎng)勵(lì)、學(xué)習(xí)率等信息。TensorBoard也會(huì)自動(dòng)啟動(dòng)如果安裝了tensorboard包你可以通過(guò)瀏覽器訪問(wèn)http://localhost:6006查看豐富的訓(xùn)練曲線圖。如果你能看到Unity窗口中的小球在嘗試保持平衡并且終端日志在持續(xù)更新那么恭喜你整個(gè)ML-Agents的安裝和基礎(chǔ)鏈路已經(jīng)徹底跑通了4. 安裝過(guò)程中的常見(jiàn)問(wèn)題與深度排查即使按照步驟操作你也可能會(huì)遇到一些“攔路虎”。下面是我總結(jié)的常見(jiàn)問(wèn)題及其解決方案。4.1 Python環(huán)境與包依賴問(wèn)題問(wèn)題mlagents-learn命令未找到或ImportError原因Python環(huán)境未激活或mlagents未安裝在當(dāng)前激活的環(huán)境中。解決在終端中確認(rèn)(mlagents)環(huán)境前綴。用conda list | findstr mlagentsWindows或conda list | grep mlagentsmacOS/Linux檢查包是否存在。如果不在重新在激活的環(huán)境中安裝。問(wèn)題安裝mlagents時(shí)出現(xiàn)大量紅色錯(cuò)誤提示某些包編譯失敗原因通常是因?yàn)槿鄙貱編譯環(huán)境Windows上常見(jiàn)或某些底層依賴如numpy的編譯工具。解決Windows安裝Microsoft Visual C Build Tools。最簡(jiǎn)便的方法是安裝Visual Studio 2019或2022并在安裝時(shí)勾選“使用C的桌面開(kāi)發(fā)”工作負(fù)載。macOS安裝Xcode Command Line Toolsxcode-select --install。Linux安裝python3-dev和build-essential等開(kāi)發(fā)包。例如Ubuntusudo apt-get install python3-dev build-essential。備選方案嘗試使用預(yù)編譯的wheel文件。有時(shí)pip會(huì)嘗試從源碼編譯而預(yù)編譯的wheel更穩(wěn)定。但這通常由pip自動(dòng)處理。4.2 Unity構(gòu)建與通信問(wèn)題問(wèn)題運(yùn)行mlagents-learn后Unity可執(zhí)行文件沒(méi)有啟動(dòng)或啟動(dòng)后立刻關(guān)閉終端提示Connection timeout原因1端口沖突。默認(rèn)通信端口是5005可能被其他程序占用。解決在mlagents-learn命令中添加--port參數(shù)指定另一個(gè)端口如--port5006。同時(shí)在Unity構(gòu)建的可執(zhí)行文件啟動(dòng)參數(shù)或通過(guò)代碼中也需指定相同端口。對(duì)于示例最簡(jiǎn)單的方法是重新構(gòu)建并在構(gòu)建前修改Academy的Port屬性。更通用的方法是在命令行啟動(dòng)可執(zhí)行文件時(shí)加參數(shù)./3DBall.exe --port5006。原因2防火墻或安全軟件阻止。解決臨時(shí)關(guān)閉防火墻或?yàn)閁nity可執(zhí)行文件和Python添加出入站規(guī)則。原因3行為類型Behavior Type設(shè)置錯(cuò)誤。解決確保Unity場(chǎng)景中智能體的Behavior Parameters組件的Behavior Type設(shè)置為Default用于訓(xùn)練或Inference Only僅運(yùn)行模型。訓(xùn)練時(shí)必須為Default。原因4可執(zhí)行文件路徑錯(cuò)誤或包含中文/特殊字符。解決使用絕對(duì)路徑并確保路徑全為英文。問(wèn)題訓(xùn)練時(shí)Unity窗口卡住不動(dòng)終端日志也不更新原因最常見(jiàn)的是Decision Requester組件的Decision Period設(shè)置過(guò)大或者智能體的邏輯中有阻塞。解決檢查Decision Requester的Decision Period訓(xùn)練時(shí)通常設(shè)為5-10。確保你的智能體Agent腳本中的CollectObservations()、OnActionReceived()、Heuristic()等方法沒(méi)有死循環(huán)或耗時(shí)極長(zhǎng)的操作。4.3 版本兼容性“玄學(xué)”問(wèn)題問(wèn)題一切步驟都對(duì)但就是連不上或報(bào)奇怪的錯(cuò)誤終極排查清單版本矩陣核對(duì)再次嚴(yán)格對(duì)照本章節(jié)開(kāi)頭給出的版本推薦表。尤其是Unity 2022.3 LTS Python 3.9 ML-Agents Release 23這個(gè)組合是經(jīng)過(guò)社區(qū)大量驗(yàn)證的穩(wěn)定組合。使用純凈新項(xiàng)目在全新的Unity項(xiàng)目中重復(fù)安裝和示例測(cè)試排除舊項(xiàng)目殘留設(shè)置或插件沖突的影響。查看完整錯(cuò)誤日志Unity構(gòu)建的可執(zhí)行文件在運(yùn)行時(shí)會(huì)在其同級(jí)目錄下生成一個(gè)Player.log文件Windows通常在%USERPROFILE%\AppData\LocalLow\CompanyName\ProductName\。Python端的錯(cuò)誤信息也會(huì)在終端完整輸出。仔細(xì)閱讀這些日志錯(cuò)誤信息往往非常具體。社區(qū)資源將錯(cuò)誤信息直接復(fù)制到Unity ML-Agents官方論壇或GitHub Issues中搜索你遇到的問(wèn)題極大概率已經(jīng)有人遇到并解決了。5. 從安裝到實(shí)戰(zhàn)下一步做什么成功運(yùn)行3DBall示例只是萬(wàn)里長(zhǎng)征第一步。接下來(lái)你可以沿著以下路徑深入解剖示例不要滿足于運(yùn)行。仔細(xì)閱讀3DBall示例中的C#腳本Ball3DAgent.cs等理解CollectObservations如何收集狀態(tài)、OnActionReceived如何執(zhí)行動(dòng)作并計(jì)算獎(jiǎng)勵(lì)、OnEpisodeBegin如何重置環(huán)境這幾個(gè)核心方法是如何實(shí)現(xiàn)的。這是你編寫自己智能體的藍(lán)圖。修改與實(shí)驗(yàn)嘗試修改3DBall的獎(jiǎng)勵(lì)函數(shù)。例如給保持平衡的時(shí)間更長(zhǎng)的行為額外獎(jiǎng)勵(lì)或者當(dāng)球掉落時(shí)給予更大的懲罰。觀察訓(xùn)練曲線和智能體最終行為的變化。這是理解強(qiáng)化學(xué)習(xí)反饋機(jī)制的關(guān)鍵。創(chuàng)建自己的第一個(gè)智能體在一個(gè)新的空?qǐng)鼍爸袆?chuàng)建一個(gè)Cube作為智能體和一個(gè)Plane作為地面。給Cube添加Behavior Parameters將Behavior Name設(shè)為MyBehavior和Decision Requester組件。創(chuàng)建一個(gè)新的C#腳本如MySimpleAgent.cs繼承自Agent類。實(shí)現(xiàn)最簡(jiǎn)單的邏輯例如讓Cube學(xué)習(xí)向前移動(dòng)。在CollectObservations中提供Cube自身的速度作為觀測(cè)在OnActionReceived中將接收到的連續(xù)動(dòng)作值如一個(gè)float轉(zhuǎn)換為力或速度施加給Cube并根據(jù)前進(jìn)距離給予獎(jiǎng)勵(lì)。為該行為創(chuàng)建一個(gè)簡(jiǎn)單的訓(xùn)練配置文件.yaml指定使用PPO算法和一些基礎(chǔ)超參數(shù)。構(gòu)建場(chǎng)景并啟動(dòng)訓(xùn)練。這個(gè)過(guò)程會(huì)讓你對(duì)ML-Agents的工作流有最直接的掌控感。探索高級(jí)特性當(dāng)你熟悉基礎(chǔ)流程后可以探索更強(qiáng)大的功能課程學(xué)習(xí)Curriculum Learning讓學(xué)習(xí)任務(wù)從易到難動(dòng)態(tài)調(diào)整加速訓(xùn)練并解決稀疏獎(jiǎng)勵(lì)問(wèn)題。模仿學(xué)習(xí)Imitation Learning通過(guò)專家演示數(shù)據(jù)來(lái)引導(dǎo)智能體適用于難以設(shè)計(jì)獎(jiǎng)勵(lì)函數(shù)的復(fù)雜任務(wù)。環(huán)境隨機(jī)化Environment Randomization在訓(xùn)練時(shí)隨機(jī)化物理參數(shù)、外觀等提升智能體在真實(shí)世界中的魯棒性。多智能體Multi-Agent訓(xùn)練多個(gè)相互協(xié)作或競(jìng)爭(zhēng)的智能體。安裝只是獲取了工具真正的樂(lè)趣和挑戰(zhàn)在于使用這個(gè)工具去創(chuàng)造。ML-Agents打開(kāi)了將復(fù)雜決策問(wèn)題交給機(jī)器學(xué)習(xí)來(lái)解決的大門無(wú)論是為了更生動(dòng)的游戲體驗(yàn)還是嚴(yán)肅的仿真研究扎實(shí)走完這安裝第一步都為你后續(xù)的所有探索鋪平了道路。記住遇到問(wèn)題多查日志、多搜社區(qū)這個(gè)活躍的社區(qū)是你最好的后盾。