捷徑

C++ 前端

PyTorch C++ 前端是一個 C++17 程式庫,用於 CPU 和 GPU 張量運算,具有自動微分和高階建構區塊,適用於最先進的機器學習應用程式。

描述

PyTorch C++ 前端可以被認為是 PyTorch Python 前端的 C++ 版本,它提供自動微分和各種更高階的抽象,適用於機器學習和神經網路。具體來說,它包含以下元件:

元件

描述

torch::Tensor

自動可微分、高效的 CPU 和 GPU 啟用張量

torch::nn

用於神經網路建模的可組合模組集合

torch::optim

用於訓練模型的最佳化演算法,例如 SGD、Adam 或 RMSprop

torch::data

資料集、資料管線和多執行緒、非同步資料載入器

torch::serialize

用於儲存和載入模型檢查點的序列化 API

torch::python

將您的 C++ 模型繫結到 Python 的膠水程式碼

torch::jit

對 TorchScript JIT 編譯器的純 C++ 存取

端到端範例

這是一個簡單的端到端範例,用於在 MNIST 資料集上定義和訓練一個簡單的神經網路

#include <torch/torch.h>

// Define a new Module.
struct Net : torch::nn::Module {
  Net() {
    // Construct and register two Linear submodules.
    fc1 = register_module("fc1", torch::nn::Linear(784, 64));
    fc2 = register_module("fc2", torch::nn::Linear(64, 32));
    fc3 = register_module("fc3", torch::nn::Linear(32, 10));
  }

  // Implement the Net's algorithm.
  torch::Tensor forward(torch::Tensor x) {
    // Use one of many tensor manipulation functions.
    x = torch::relu(fc1->forward(x.reshape({x.size(0), 784})));
    x = torch::dropout(x, /*p=*/0.5, /*train=*/is_training());
    x = torch::relu(fc2->forward(x));
    x = torch::log_softmax(fc3->forward(x), /*dim=*/1);
    return x;
  }

  // Use one of many "standard library" modules.
  torch::nn::Linear fc1{nullptr}, fc2{nullptr}, fc3{nullptr};
};

int main() {
  // Create a new Net.
  auto net = std::make_shared<Net>();

  // Create a multi-threaded data loader for the MNIST dataset.
  auto data_loader = torch::data::make_data_loader(
      torch::data::datasets::MNIST("./data").map(
          torch::data::transforms::Stack<>()),
      /*batch_size=*/64);

  // Instantiate an SGD optimization algorithm to update our Net's parameters.
  torch::optim::SGD optimizer(net->parameters(), /*lr=*/0.01);

  for (size_t epoch = 1; epoch <= 10; ++epoch) {
    size_t batch_index = 0;
    // Iterate the data loader to yield batches from the dataset.
    for (auto& batch : *data_loader) {
      // Reset gradients.
      optimizer.zero_grad();
      // Execute the model on the input data.
      torch::Tensor prediction = net->forward(batch.data);
      // Compute a loss value to judge the prediction of our model.
      torch::Tensor loss = torch::nll_loss(prediction, batch.target);
      // Compute gradients of the loss w.r.t. the parameters of our model.
      loss.backward();
      // Update the parameters based on the calculated gradients.
      optimizer.step();
      // Output the loss and checkpoint every 100 batches.
      if (++batch_index % 100 == 0) {
        std::cout << "Epoch: " << epoch << " | Batch: " << batch_index
                  << " | Loss: " << loss.item<float>() << std::endl;
        // Serialize your model periodically as a checkpoint.
        torch::save(net, "net.pt");
      }
    }
  }
}

若要查看使用 PyTorch C++ 前端的更完整範例,請參閱範例儲存庫

哲學

PyTorch 的 C++ 前端的設計理念是 Python 前端很棒,應該盡可能使用;但在某些情況下,效能和可攜性要求使得使用 Python 直譯器不可行。例如,對於低延遲、高效能或多執行緒環境(例如,視訊遊戲或生產伺服器),Python 是一個糟糕的選擇。C++ 前端的目標是解決這些使用案例,同時不犧牲 Python 前端的使用者體驗。

因此,C++ 前端的編寫考慮了以下幾個哲學目標:

  • 在設計、命名、慣例和功能上,密切模仿 Python 前端。雖然兩個前端之間可能偶爾存在差異(例如,在我們放棄了已棄用的功能或修復了 Python 前端中的「瑕疵」的地方),但我們保證將 Python 模型移植到 C++ 的工作應該僅僅在於翻譯語言特性,而不是修改功能或行為。

  • 優先考慮彈性和使用者友善性,而非微最佳化。 在 C++ 中,您通常可以獲得最佳程式碼,但代價是極不友善的使用者體驗。 彈性和動態性是 PyTorch 的核心,C++ 前端旨在保留這種體驗,在某些情況下,會犧牲效能(或「隱藏」效能調整),以保持 API 的簡潔性和可解釋性。 我們希望不以編寫 C++ 為生的研究人員也能夠使用我們的 API。

一句警告:Python 不一定比 C++ 慢! Python 前端會調用 C++ 來處理幾乎所有計算密集型任務(尤其是任何類型的數值運算),這些運算將佔用程式中大部分的時間。 如果您更喜歡編寫 Python,並且可以負擔編寫 Python 的成本,我們建議您使用 PyTorch 的 Python 介面。 但是,如果您更喜歡編寫 C++,或者需要編寫 C++(因為多執行緒、延遲或部署要求),則 PyTorch 的 C++ 前端提供了一個 API,它與 Python 對應項一樣方便、靈活、友善和直觀。 這兩個前端服務於不同的用例,緊密合作,並且都不打算無條件地取代另一個。

安裝

有關如何安裝 C++ 前端函式庫發行版(包括如何建構一個依賴於 LibTorch 的最小應用程式的範例)的說明,可以透過點擊這個連結找到。

文件

取得 PyTorch 的完整開發者文件

檢視文件

教學

取得初學者和高級開發人員的深入教學

檢視教學

資源

尋找開發資源並獲得您的問題解答

檢視資源