應用程式最佳實務¶
TorchX 應用程式可以使用任何語言以及任何一組程式庫來撰寫,以實現最大的靈活性。但是,我們確實有一套標準的建議程式庫和實務,可以作為使用者的起點,並在內建元件和應用程式之間提供一致性。
如需如何處理元件管理和 AppDef 的資訊,請參閱 元件最佳實務。
資料傳遞和儲存¶
我們建議使用 fsspec。fsspec 允許使用可插拔的檔案系統,因此只需更改輸入和輸出路徑,即可撰寫一次應用程式並在多數基礎架構上執行。
TorchX 內建元件使用 fsspec 進行所有儲存體存取,以便透過使用不同的 fsspec 後端或新增新的後端,在新的環境中執行。
Pytorch Lightning 原生支援 fsspec,因此在其他地方使用 fsspec 可以與您的訓練器無縫整合。
使用遠端儲存體還可以更輕鬆地將您的應用程式轉換為透過 torch.distributed.elastic 等程式庫以分散式支援執行。
訓練迴圈¶
建構訓練迴圈的方法有很多種,這在很大程度上取決於您的模型類型和架構,這就是我們沒有提供現成方法的原因。
一些常見的選擇是
純 Pytorch
- 使用託管訓練迴圈
如需詳細資訊,請參閱 訓練。
指標¶
對於記錄指標和監控您的作業,我們建議使用獨立的 Tensorboard,因為它由 Pytorch Tensorboard 整合 和 Pytorch Lightning 記錄 原生支援。
由於 Tensorboard 可以記錄到遠端儲存體(如 s3 或 gcs),因此您可以在模型訓練時檢視有關模型的複雜資訊。
如需有關 TorchX 中指標處理的詳細資訊,請參閱 指標。
檢查點¶
定期檢查點允許您的應用程式從失敗中恢復,並且在某些情況下允許您使用不同的參數重新啟動訓練器,而不會遺失訓練進度。
Pytorch Lighting 提供了一種標準化的方式來為您的模型建立檢查點。
微調¶
為了支援遷移學習、微調和從檢查點繼續等功能,我們建議為您的應用程式提供一個命令列參數,以從檢查點檔案繼續。
這將允許您從暫時性錯誤中恢復,繼續使用新資料進行訓練,或者稍後調整學習率而不會遺失訓練進度。
擁有載入支援可以減少程式碼並提高可維護性,因為您可以使用一個應用程式執行許多類似的任務。
可解譯性¶
我們建議使用 captum 進行模型可解譯性和分析模型結果。這可以從 Jupyter 筆記本或元件以互動方式使用。
如需詳細資訊,請參閱 解譯。
模型封裝¶
Pytorch 社群尚未針對一種封裝格式達成共識。以下是一些選項,以及您可能需要使用它們的時間。
Python + 已儲存的權重¶
這是封裝模型最常見的格式。若要使用,您將從 Python 檔案載入模型定義,然後從 .ckpt
或 .pt
檔案載入權重和狀態字典。
這就是 Pytorch Lightning 的 ModelCheckpoint 鉤子的工作原理。
這是最常見的,但會讓重複使用應用程式變得更加困難,因為您的訓練器應用程式需要包含模型定義程式碼。
TorchScript 模型¶
TorchScript 是一種建立可序列化和最佳化的 Pytorch 模型的方法,可以在沒有 Python 的情況下執行。這可以用於在不依賴 Python 的 GIL 的情況下以高效能的方式進行推論或訓練。
這些模型檔案是完全自我描述的,但並非所有 Pytorch 模型都可以自動轉換為 TorchScript。
請參閱 TorchScript 文件。
TorchServe 模型封存器 (.mar)¶
如果您想使用 TorchServe 進行推論,則需要將模型匯出為此格式。對於推論,通常使用模型的量化版本,因此最好讓您的訓練器匯出完整精度模型以進行微調,以及匯出用於 TorchServe 使用的量化 .mar
檔案。
請參閱 模型封存器文件。
torch.package¶
這是一種新的格式,從 Pytorch 1.9.0 開始,可用於儲存和載入模型定義及其權重,因此您不需要單獨管理模型定義。
請參閱 torch.package 文件。
它相當新,尚未被廣泛採用或支援。
服務/推論¶
對於服務和推論,我們建議在常見用例中使用 TorchServe。我們提供了一個元件,允許您透過管理 API 將模型上傳到 TorchServe。
如需詳細資訊,請參閱 服務 內建元件。
出於更複雜的服務和效能原因,您可能需要撰寫自己的自訂推論邏輯。Torchscript 和 torch::deploy 是一些標準公用程式,您可以使用它們來建構自己的推論伺服器。
測試¶
由於 TorchX 應用程式通常是標準 Python,因此您可以像使用任何其他 Python 程式碼一樣為它們撰寫單元測試。
import unittest
from your.custom.app import main
class CustomAppTest(unittest.TestCase):
def test_main(self) -> None:
main(["--src", "src", "--dst", "dst"])
self.assertTrue(...)