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 周围调用框架管理的逻辑,包括钩子。相比直接调用 model.forward(inputs),应优先使用 model(inputs)。

检查点和互操作性 #

使用 state_dict() 保存模型参数,并且只从可信来源加载参数。PyTorch 序列化可以使用 Python pickle,而反序列化期间可能执行代码。对于不可信的模型权重,在工具支持时应优先使用 safetensors 等更安全的格式。

LibTorch 提供用于在原生应用中嵌入 PyTorch 模型的 C++ API,但 Python 和 C++ 产物必须使用兼容的版本和 API 生成。测试部署中使用的确切推理路径、设备放置和输入预处理。

评论

在 GitHub 上阅读或评论(发表评论需要登录)