Torch 與 PyTorch

最後更新: 2024-03-14 19:05:08 +0800 +0800
原文以英文撰寫。您正在閱讀AI翻譯版本。

Torch 是早期的機器學習框架,具有 Lua 介面與 C/CUDA 核心。PyTorch 是其後續生態系:它保留了名稱與部分實作傳承,但目前是以 Python 與 C++ API 為核心、持續開發中的框架。LibTorch 是 PyTorch 的 C++ 發行版。

安裝 PyTorch #

對大多數 Python 專案而言,使用 PyTorch 安裝選擇器產生的命令安裝已發布的套件。適用的套件取決於作業系統、Python 版本,以及應用程式使用 CPU、CUDA 或其他加速器後端的情況。

sh
python -m pip install torch torchvision

驗證安裝,並在適用時確認 CUDA 是否可用:

python
import torch

print(torch.__version__)
print(torch.cuda.is_available())

從原始碼建置 LibTorch #

從原始碼建置通常沒有必要;除非需要自訂建置,否則使用預先建置的套件或 LibTorch 封存檔。原始碼建置需要相容的 C++ 編譯器、CMake、Ninja、Python 工具,以及建置選取的任何加速器 SDK。複製發布版本及其子模組,然後依照該發布版本的建置說明操作:

sh
git clone --recursive https://github.com/pytorch/pytorch
cd pytorch
git checkout <release-tag>
git submodule sync
git submodule update --init --recursive
cmake -S . -B build -GNinja -DBUILD_PYTHON=OFF
cmake --build build

建置旗標與支援的編譯器會隨發布版本變更,因此未檢查發布文件前,不要將過時的命令列複製到正式環境自動化中。

張量 #

torch.Tensor 是具有形狀、資料型別與裝置的同質多維陣列。與典型的 NumPy 陣列不同,張量可以位於 CPU 或加速器上,也能參與自動微分。

python
import torch

x = torch.randn(3, 4, device="cpu")
y = x.mean(dim=1)

某些運算會回傳現有儲存空間的檢視,而非複製資料。檢視可能不是連續的,例如轉置之後;因此需要連續儲存空間的運算可能需要 tensor.contiguous()。

建置模組 #

神經網路通常透過子類別化 torch.nn.Module 組成。在 __init__ 中註冊參數與子模組,然後在 forward 中描述前向計算:

python
import torch

class MyLinear(torch.nn.Module):
    def __init__(self, in_features: int, out_features: int) -> None:
        super().__init__()
        self.weight = torch.nn.Parameter(torch.randn(in_features, out_features))
        self.bias = torch.nn.Parameter(torch.zeros(out_features))

    def forward(self, inputs: torch.Tensor) -> torch.Tensor:
        return inputs @ self.weight + self.bias

呼叫模組會在 forward 周圍觸發框架管理的邏輯,包括 hooks。優先使用 model(inputs),而不是直接呼叫 model.forward(inputs)。

檢查點與互通性 #

使用 state_dict() 儲存模型參數,且只從受信任的來源載入。PyTorch 序列化可以使用 Python pickle,在反序列化期間可能執行程式碼。對不受信任的模型權重,若工具支援,優先使用 safetensors 等更安全的格式。

LibTorch 提供 C++ API,讓原生應用程式能嵌入 PyTorch 模型,但 Python 與 C++ 構件必須使用相容的版本與 API 產生。測試部署時使用的確切推論路徑、裝置配置與輸入前處理。

評論

在 GitHub 上閱讀或評論(發表評論需要登入)