PyTorch

**PyTorch**は、コンピュータビジョンや自然言語処理で利用されているを元に作られた、Pythonのオープンソースの機械学習ライブラリである。最初はFacebookの人工知能研究グループAI Research lab（FAIR）により開発された。PyTorchはフリーでオープンソースのソフトウェアであり、修正BSDライセンスで公開されている。

さまざまなディープラーニングのソフトウェアがPyTorchを利用して構築されており、その中には、UberのPyro、HuggingFaceのTransformers、Catalystなどがある。

PyTorchは以下の機能を備えている：
* 強力なGPUサポートを備えた（NumPyのような）テンソル演算
* 自動微分エンジンの上に構築された深層学習トレーニング (torch.autograd)
* 自動微分化や自動ベクトル化などの（JAXのような）関数変換 (functorch / torch.func)
* 実行時コンパイル (torch.jit)
* 並列処理（#並列処理参照）
* 機械学習モデル形式「ONNX」へのエクスポート (torch.onnx)

## 歴史
FacebookはPyTorchとConvolutional Architecture for Fast Feature Embedding (Caffe2) をメンテナンスしていた。しかし、互換性が無いためPyTorchで定義されたモデルのCaffe2への移行やまたその逆の作業が困難であった。これら2つのフレームワークでモデルを変換することができるように、2017年9月にFacebookとマイクロソフトがOpen Neural Network Exchange (ONNX) プロジェクトを作成した。2018年3月下旬に、Caffe2はPyTorchに併合された。

2019年12月、Preferred Networksは自社開発していたChainerのバージョン7をもって、PyTorchによる研究開発へ順次移行して行くことを発表した
。

## PyTorchのテンソル
PyTorchはテンソルにTensor (`torch.Tensor`) と呼ばれるクラスを定義しており、それを均質（）な多次元の長方形の数値配列の保存と演算に利用している。PyTorchのTensorはNumPyの多次元配列 (`numpy.ndarray`) に似ているが、CUDAが有効なNvidiaのGPU上での演算も可能になっている。NumPyの配列からPyTorchのテンソルへと変換するための専用APIも存在する (torch.from_numpy)。なおPyTorch 2.1以降はPyTorchだけでなくNumPyを使ったコードのGPU向けコンパイルにも対応している。

PyTorchには32ビット浮動小数点数用の FloatTensor 16ビット浮動小数点数用のHalfTensor 、32ビット整数用の IntTensor など、さまざまな型のTensorサブタイプが存在する。またテンソルにはCPUに配置する torch.*Tensor とGPUに配置する torch.cuda.*Tensor が存在している。それぞれは `Tensor.to(...)` メソッドなどを用いることで変換することができる。

また PyTorch のテンソルは機械学習の逆伝播に使われる微分のためのパラメータ（勾配データ (`Tensor.grad`) や微分関数 (`Tensor.grad_fn`)）を持つことが出来る（`requires_grad=True`の場合、詳しくは後述の#autogradモジュールを参照）。勾配データ (grad) は追加メモリを必要とするため、不要な場合に取り除くことが可能となっている（`torch.no_grad()` や `Tensor.detach()` など）。

複素数テンソル（`dtype=torch.cfloat`のテンソル）や量子化テンソル（`dtype=torch.quint8`や`dtype=torch.qint8`などのテンソル）も存在している。量子化テンソルはスケールやゼロポイントなどの量子化パラメータを持っている。なお4ビット量子化向けの`dtype=torch.quint4x2`のテンソルもあるが、2023年現在その対応は一部（EmbeddingBag命令）のみとなっている。また8ビット浮動小数点数向けの `torch.float8_e4m3fn` 及び `torch.float8_e5m2` のテンソルにも対応しているが対応命令はごく一部となっている[（8ビット浮動小数点数はNVIDIA H100などの一部GPUのTransformer Engineがネイティブに対応している）。

基本のテンソルは長方形であり、非長方形のデータを扱う際にはpaddingで穴埋めする必要があるが、穴の多いデータを穴埋めするのは無駄となるため、非長方形のデータを扱うための疎テンソル (torch.sparse) やネストされたテンソル (torch.nested) も用意されている。なお、疎テンソル構造はNVIDIA GPUのAmpere以降などでも直接サポートされるようになっているものの、その対応は2:4スパース（半構造化スパース）に限られているが、PyTorch 2.1以降はその疎半構造化テンソルにも試験的に対応している (SparseSemiStructuredTensor)。

## PyTorchのモデル

PyTorchのモデルは基本的に`torch.nn.Module`の派生クラスとする必要があり、その`train()` メソッドと`eval()`メソッドにより、トレーニングモードと評価モードの切り替えが可能となっている。

また`to(...)`メソッドなどによってモデル全体のパラメータ型の変換が可能であり、それによってモデルパラメータの半精度化（専用の`half()`メソッドもある）やbfloat16化（専用の`bfloat16()`メソッドもある）を行うことでメモリ使用量を減らすことが可能となっている。ただしモデルパラメータのより高い圧縮を行うためには torch.quantization などで量子化を行う必要がある。

## フロントエンド
PyTorchのフロントエンドには PythonインタフェースだけでなくC++インタフェースも存在している。

### autogradモジュール
PyTorchは自動微分と呼ばれるメソッドを利用する。recorderは実行された演算を記録し、その後、勾配の計算を行うときに記録した演算を逆方向にリプレイする。このメソッドは、ニューラルネットワークの構築時に特に強力であるため、順方向のパラメータの微分を計算することで、1エポックの計算にかかる時間を節約することができる。

### <code>optim</code>モジュール
`torch.optim`は、ニューラルネットワークの構築時に使用されるさまざまな最適化アルゴリズムを実装したモジュールである。通常使用されるメソッドのほとんどはすでに対応しているため、スクラッチで構築する必要がない。

### <code>nn</code>モジュール
PyTorchのautogradは、簡単に計算グラフを定義して勾配を得られるようになっているが、生のautogradは複雑なニューラルネットワークを定義するにはすこし低レベルすぎる場合がある。そのような場合のサポートとして`nn`モジュールが提供されている。

### <code>jit</code>モジュール
TorchScriptとして後述。

## バックエンド

PyTorchのバックエンドは主にC++で実装されている (ATen)。ATenは外部から直接使うことも可能となっている (C++ではATenライブラリ、Pythonではtorch.ops.aten)。

またPyTorchにはCPUだけでなくGPUバックエンドもあり、NVIDIA製GPU向けにはCUDAで、AMD製GPU向けにはのHIPで、インテル製GPU向けにはSYCLで、macOS向けにはMetal Performance Shaders (MPS) で実装されている。CUDAにバージョン毎の互換性の問題があることもあって、PyTorch のバイナリはGPUプラットフォーム毎に別々で提供されている。

AI専用チップ向けのバックエンドでは外部プロジェクトとしてIntel Gaudi向けのhabana_frameworks.torch、Huawei Ascend 向けのtorch_npuなどが存在する。PyTorchではこれら外部バックエンドを登録するための仕組み「PrivateUse1」が用意されている。

PyTorch 2.0以降にはOpenAIのTritonなどをバックエンドとして使用できるTorchDynamoも統合されている（#TorchDynamoを参照）。TorchDynamoではバックエンドの実装を簡略化するために、複合的な Aten 命令を単純な Prims 命令 (torch._prims) へと低下させる機能も提供している。

またPyTorchでは別パッケージとしてTorch-TensorRTが用意されており、これを使うことにより PyTorchのバックエンドとしてNVIDIAのTensorRTを使うことも可能となっている。

### 並列処理
PyTorchは標準で並列処理機能を内蔵しているものの一部のみとなっている。外部プロジェクトのはより高度な並列処理を実装している。並列処理を簡単に使うための補助ライブラリとしてHuggingFace AccelerateやLightning Fabric（旧Lightning Lite）が存在する。

また既存モデルでは推論の並列処理を簡単に使うためのDeepSpeed も存在する。

またコンピュータ・クラスターを使った学習向けでは外部プロジェクトにMosaicMLのComposerが存在し、このComposerはクラウドコンピューティングを使った学習とも相性が良いとされる。

#### データ並列 (DP)
PyTorchは以下のデータ並列処理に対応している:
* マルチスレッドデータ並列処理 (torch.nn.DataParallel) - 2024年現在Pythonのグローバルインタプリタロック (GIL) の問題がありスケールしにくい。
* マルチプロセス/マルチマシンデータ並列処理 (DDP; torch.nn.parallel.DistributedDataParallel)
* 完全共有データ並列処理 (FSDP; torch.distributed.fsdp.FullyShardedDataParallel) - FairScaleのFSDPを統合した。

前述のFairScale及びDeepSpeedは、どちらも最適化状態分割 (OSS; ZeRO Stage 1)、最適化および勾配状態分割 (SDP; ZeRO Stage 2)、完全共有データ並列処理 (FSDP; ZeRO Stage 3) の3つに対応している。加えてDeepSpeedはZeRO Stage 3よりもノード間通信効率の良いZeRO++にも対応している。

その他DeepSpeedにはデータをCPUメモリやNVMeなどへとオフロードするための ZeRO-Infinity（及びそのサブセットでホストCPUメモリのみ対応の旧来の ZeRO-Offload）も搭載されている。

#### パイプライン並列 (PP)
PyTorchは以下のパイプライン並列処理に対応している:
* パイプライン並列処理 (torch.distributed.pipeline) - nn.Sequentialにのみ対応。FairScaleの実装 (Fairscale.nn.Pipe) を統合したもので、元々は torchgpipe の GPipe実装に由来する。

PyTorchモデルの自動パイプライン並列処理に向けては PiPPy が開発中となっている。またDeepSpeedもパイプライン並列処理に対応している (deepspeed.pipe)。

また推論のパイプライン並列処理にはPetalsやFlexGenも存在する。

#### テンソル並列 (TP)
PyTorchは以下のテンソル並列処理に対応している:
* テンソル並列処理 (torch.distributed.tensor.parallel)

またDeepSpeedもDeepSpeed-Inferenceで推論におけるテンソル並列処理に対応している。

#### エキスパート並列
エキスパート並列は複数エキスパート（専門家）の混合 () レイヤー（Switch Transformerなど）を用いたモデルの並列処理を行う。

このエキスパート並列には DeepSpeed MoE が対応している。

#### 推論の自動ウェイトオフロード

HuggingFaceのAccelerateは大規模モデルの推論を処理するためにウェイトの自動オフロードに対応している。

またDeepSpeed も推論でのデータオフロードにも対応している（DeepSpeed ZeRO-Inference）。

#### その他
PyTorchはCUDAの複数ストリームを使った明示的なGPU並列処理にも対応している。

## ファイル形式

PyTorchで良く使われているファイル形式はPythonにおけるPythonオブジェクトの標準シリアライズ（直列化）であるPickle形式 (*.pkl) 及びウェイトやバイアスなどのパラメータを無圧縮ZIPアーカイブでまとめたpt形式となっている。PyTorchでのこの形式の読み書きは`torch.load/torch.save`や`torch.jit.load/torch.jit.save`（TorchScript向け）などを使うことで可能となっている。この形式はPyTorch内外を含め広く用いられているものの、Pickle形式は仮想マシンの命令コードを記述したものであり様々な操作が実行できるため、セキュリティのリスクが存在している。

そのためPyTorch標準形式よりも安全で効率的なパラメータ保存形式が開発されてきており、その中の一つHuggingFaceのsafetensors形式は広く普及してきている。

## ONNX出力

ONNX出力 (torch.onnx) には従来のTorchScript経由によるもの (torch.onnx.export) と新しいTorchDynamo経由によるもの (torch.onnx.dynamo_export) がある。前者は#TorchScriptを参照。

## TorchScript
**TorchScript**は推論モデル生成のための静的型付き言語である。Pythonのサブセット。TorchScriptプログラムはPythonに依存しない環境（例: C++）で実行可能であり、JITコンパイルにより動作環境での最適化がおこなわれる。JITコンパイラでは演算fusion等がおこなわれる。

なおTorchScriptモデルの保存にはTorchScriptモデル形式が使われている (torch.jit.load / torch.jit.save) が、この形式はPyTorchモデル形式と同じく拡張子に「.pt」が使われている。またTorchScriptを介したONNX形式への変換 (torch.onnx.export) も可能となっている。また外部のLLVMプロジェクトのTorch-MLIRではTorchScriptを介してPyTorchモデルのコンパイルを行うことができる。

### 実行
TorchScriptはJITオプティマイザ・JITコンパイラ付きのインタプリタにより実行される。内部ではGraphExecutorによる最適化とinterpreterによる実行がおこなわれる。対応している最適化には、入力型に基づくGraphの特殊化、演算子の融合 (Op fusion)、定数の事前計算、不要ノード削除などがある。

### 生成
TorchScriptコードは直接記述 (torch.jit.script) およびPyTorch実行トレース (torch.jit.trace) により生成される。

以下は前向き (forward) 関数のスクリプト変換の例である：
```python3
import torch # PyTorchモジュールを読み込み
def f(x, y): return x + y # 前向き関数を作る
ts_converted = torch.jit.script(f) # Pythonコードから直接TorchScriptに変換
print("Converted:\n%s" % ts_converted.code) # 変換したTorchScriptを表示
ts_traced = torch.jit.trace(f, (torch.tensor([1,2]), torch.tensor([3,4]))) # PyTorchの実行をトレースしてTorchScriptを生成
print("Traced:\n%s" % ts_traced.code) # 生成したTorchScriptを表示

torch.jit.save(ts_converted, "converted.pt") # 変換したTorchScriptをTorchScriptモデル形式で保存
torch.onnx.export(ts_converted, (torch.tensor([1,2]), torch.tensor([3,4])), "converted.onnx") # 上記をONNX形式で出力
```


#### torch.jit.script
`'''torch.jit.script'''` はTorchScriptコンパイラのPythonラッパー関数である。

`torch.jit.script` はPythonオブジェクトとして書かれたTorchScriptコードをコンパイラへ渡し、コンパイル結果へPythonからアクセスするためのラッパーオブジェクトを返す。Pythonデコレータとしても利用できる。

TorchScriptコードのコンパイルをおこなうため、全てのTorchScirpt機能を利用できる（c.f. `[[PyTorch#torch.jit.trace|torch.jit.trace]]` によるトレース）。例えば動的条件分岐を記述できる。

#### torch.jit.trace
`'''torch.jit.trace'''` は実行時トレースに基づくPython-to-TorchScriptトランスパイラである。

`torch.jit.trace` は実行可能Pythonオブジェクトとその仮入力を引数に取り、これをトレースしながら実行し、トレース結果に基づいてTorchScriptコードを生成する。すなわち実行時トレースに基づいてPythonコードをTorchScriptコードへ変換する。

仮入力を用いたトレースに基づいて生成をおこなうため、利用できるTorchScript機能に制限がある（c.f. `[[PyTorch#torch.jit.script|torch.jit.script]]` によるコンパイル）。例えば条件分岐は仮入力が満たす片方のパスしか記録されないため、TorchScriptの動的条件分岐として変換されない。すなわちTorchScriptの動的条件分岐は利用できない。

## FX
**torch.fx** はモデルの高レベルグラフ化・変換・コード生成に関するモジュールである。モデルを入力/出力/演算の有向非巡回グラフと見なすIRを定義し、モデル→IR→モデルの変換とIR編集をサポートする。主に次の3つの機能を提供する。

* Model-to-IR: シンボリックトレースによるPython/PyTorchモデルからのIR生成
* IR-to-IR: IRで表現されたグラフの変換
* IR-to-Model: IRからのPython/PyTorchコード生成

FXはPythonをホスト言語とするIRグラフのメタプログラミングであり、グラフの分析・可視化、演算子の書き換えによる量子化、グラフ全体を考慮したop fusion、IRからのアクセラレータコード直接生成など様々な用途に利用される。

モデルエクスポートのための幅広い演算サポートを目指すTorchScript IRと異なり、FX IRは動的な制御フローを含まず演算ノード単位の操作を前提とした高レベルな表現と、それに付随するシンプルなIR生成・IR操作・モデル生成実装を掲げている。

以下は前向き (forward) 関数の変換の例である：
```python3
import torch # PyTorchモジュールを読み込み
def f(x, y): return x + y # 前向き関数を作る
fx_traced = torch.fx.symbolic_trace(f) # PyTorchの実行をトレースしてFX Graphを生成
print(fx_traced.graph) # FX GraphのIRを表示
print(fx_traced.code) # FX GraphをPythonコードに再変換して表示
```


### AOT Autograd
**AOT Autograd** (functorch.compile) は前向き関数と後向き関数をコンパイルするための実験的サブシステムである。FX GraphをTorchScriptのコンパイラによってコンパイルするための functorch.compile.ts_compile も実験的に提供されている。

以下は前向き (forward) 関数の変換の例である：
```python3
import torch, functorch # PyTorch及びfunctorchモジュールを読み込み
def f(x, y): return x + y # 前向き関数を作る
fx_traced = torch.fx.symbolic_trace(f) # PyTorchの実行をトレースしてFX Graphを生成
ts_compiled = functorch.compile.ts_compile(fx_traced, [torch.Tensor([1,2]), torch.Tensor([3,4])]) # TorchScriptコンパイラでFXグラフをコンパイル
ts_compiled([torch.Tensor([1,2]), torch.Tensor([3,4])]) # コンパイルされた関数を実行
```


### TorchDynamo
**TorchDynamo** (torch._dynamo) は任意のPythonコードをコンパイルのためのサブシステムである。JITコンパイルするための`torch.compile` API、事前コンパイルするための`torch.export` APIもある（後者は#事前コンパイルと量子化参照）。コンパイルできないコードは自動的にPythonインタプリタへとフォールバックされる。2023年にリリースされたPyTorch 2.0で本体へと統合された。

狭義のTorchDynamoはPythonのバイトコードから前述のFX Graphを作るサブシステムであり、FX Graphを各実行環境向けIRへと変換するための各バックエンド（TorchInductor、onnxrtバックエンドなど）と組み合わせてPythonコードのコンパイルを行うことができる。バックエンドを実装しやすくするためのものとして、FX Graphの複合的なAten命令を単純なPrim命令へと置き換える*PrimTorch*も存在する。

以下は前向き (forward) 関数の最適化の例である：
```python3
import torch
def f(x, y): return x + y # 前向き関数を作る
optimized_f = torch.compile(f, backend="inductor") # 前向き関数をTorchDynamo（+ TorchInductor）で最適化
optimized_f(1, 2) # 最適化された前向き関数を実行
```


また派生プロジェクトとしてバックエンドにOpenXLAのXLAコンパイラを使うためのPyTorch/XLAも開発中となっているが、こちらも試験的にTorchDynamoへと対応しており、場合によってはTorchDynamo+Inductorよりも高速であるとされる。

### 事前コンパイルと量子化

PyTorch 2.1以降には事前コンパイル (torch.export) が試験的に実装されている。また量子化 (torch.ao.quantization) も試験的にtorch.exportに対応している。

量子化では訓練後量子化（Post Training Quantization; PTQ）と量子化意識訓練 (Quantization Aware Training; QAT) の両方に対応している。

## モバイル向け展開

PyTorchモデルのモバイル向け展開にはPyTorch MobileとExecutorchが存在する。

PyTorch MobileはTorchScriptを使った軽量インタプリタとなっているが、最適化 (torch.utils.mobile_optimizer) にも対応している。

一方、Executorchはtorch.compileベースとなっている。

またPyTorchのモデルから別の機械学習フレームワークTensorFlowのモバイル向け実装LiteRT（旧称TensorFlow Lite）のモデルへと変換することも可能であり、これには前述のONNX出力でONNX形式を出力した後にそのファイルをonnx2tfでLiteRTモデルへと変換する方法や、GoogleのAI Edge Torchを使う方法が存在する。

## モデル / ライブラリ
### Transformer モデル

性能の高い機械学習モデル「Transformer」が人気となるにつれ、PyTorchでも内部プロジェクト外部プロジェクト合わせ数多くの実装が登場した。その代表的なものには以下が存在する：
* torch.nn.Transformer - PyTorch 1.2で実装された。
** Accelerated Transformers - 旧Better Transformers。HazyResearch社 の FlashAttention や Meta AI社 の xFormers などを取り入れて上記APIを高速化したものであり、PyTorch 2.0で安定版が搭載された。前身のBetter TransformersはHugging FaceのOptimumで簡単に使用することが出来た。
* Transformers (Hugging Face) - 様々な応用モデルを実装している。PyTorch以外にも対応している。
* Fairseq (Meta AI) - Transformer派生を含む様々な応用モデルを実装している。またNVIDIAによりこのFairseqに基づくTransformerの実装が「Transformer for PyTorch」として提供されている。
* xFormers (Meta AI) - 高速かつ省メモリな複数の実装を含んでいる（CUTLASSを使った実装やOpenAI Tritonを使った実装など）。前述のFairseqや後述のDiffusersでも使えるようになっている。

### 拡散モデル
拡散モデル（確率拡散モデル; Diffusion model）は特に生成AI（ジェネレーティブAI）において人気となり、PyTorchでもその実装が登場した。その代表的なものには以下が存在する：
* Diffusers (Hugging Face) - 単純なU-Netベースの拡散モデルだけでなく、変分オートエンコーダー (VAE) によるを使った潜在拡散モデル (LDM) やその応用の Stable Diffusion (SD)、埋め込み表現にCLIPの代わりにXLM-RobertaベースのAltCLIPを使ってマルチリンガル化した AltDiffusion、ベクトル量子化VAE (VQ-VAE) による潜在空間を使った VQ-Diffusion、CLIPのテキスト埋め込みを直接使わず画像埋め込みへと変換してからガイドとして使用するDALL-E 2を模したKarlo unCLIP、U-Net部分までTransformerに置き換えたDiT (Diffusion Transformer)、動画生成に対応する Text-to-Video / Text2Video-Zero、オーディオに特化した Audio Diffusion / Latent Audio Diffusion、 MIDIからオーディオを生成する Spectrogram Diffusion、汎用拡散モデルの Versatile Diffusion などを実装している。また追加学習ではTextual Inversion、Text-to-imageファインチューニング、DreamBooth、LoRAなどに対応している。

### torchvision
**torchvision**はPyTorch向けの画像処理向けのライブラリである。画像分類 (Swin Transformer / MaxVit / Swin Transformer V2 / EfficientNet / ConvNeXt / EfficientNetV2 / RegNet / VisionTransformer等)、動画分類 (Video ResNet / Video S3D / Video MViT / Video SwinTransformer)、セマンティックセグメンテーション (LRASPP / FCN / DeepLabV3)、物体検出 (SSDlite / SSD / FCOS / RetinaNet / Faster R-CNN)、インスタンスセグメンテーション (Mask R-CNN)、キーポイント検出 (Keypoint R-CNN)、オプティカルフロー (RAFT) などに対応している。

### torchaudio
**torchaudio**はPyTorch向けの音声処理向けのライブラリである。音声認識 (Emformer RNN-T / XLS-R / Conformer RNN-T)、視覚音声認識 (AV-ASR)、テキスト音声合成 (Tacotron2)、音声強調 (MVDR)、ビームフォーミング (DNNBeamformer)、 (Hybrid Demucs)、音声品質測定 (TorchAudio-Squim) 、テキストへの強制位置合わせ (CTC forced alignment) などに対応している。

その他、音声のベクトル化ではwav2vec 2.0、HuBERT、WavLMに対応している。GPUベースのCTCビームサーチ (CUCTCDecoder) にも対応している。

### torchtext

**torchtext**はPyTorch向けのテキスト処理ライブラリである。大規模言語モデル (LLM) の XLM-RoBERTa や T5に対応している。なお大規模言語モデルで文書分類、言語モデリング、質疑応答、機械翻訳などの多様なタスクを行うには、モデルをそれぞれへと適応するためのファインチューニングやプロンプティングが必要となる。

その他、テキストのトークン化では正規表現での置換によるトークン化 (RegexTokenizer)、文字バイト対符号化 (BPE) によるトークン化 (CharBPETokenizer)、バイトレベルBPEによるトークン化（CLIPで使われるCLIPTokenizerやGPT-2で使われるGPT2BPETokenizer）、WordPieceによるトークン化（BERTで使われるBERTTokenizer）、事前学習モデルによるトークン化（T5などに使われるSentencePieceTokenizer）に対応している。また単語の埋め込みベクトルへの変換ではGloVe、FastText、CharNGramに対応している。

2023年9月、開発をメンテナンスモードに移行し、2024年4月開発終了となった。

### TorchRL
**TorchRL**はPyTorch向けの強化学習ライブラリである。暗黙的Q学習 (IQL)、深層Q学習 (DQN)、 (PPO)、深層決定論的方策勾配法 (DDPG)、双生遅延DDPG (TD3)、Advantage Actor-Critic (A2C)、Soft-Actor-Critic (SAC)、保守的Q学習 (CQL)、ランダム化アンサンブル化ダブルQ学習 (REDQ)、Dreamer、Decision Transformer、人間のフィードバックによる強化学習 (RLHF)に対応している。

### TensorDict

**TensorDict**はPyTorch向けの辞書構造ライブラリである。

### TorchRec

**tensordict**はPyTorch向けのレコメンデーション（推薦）ライブラリである。

### torchtune

**torchtune**はPyTorch向けの大規模言語モデル (LLM) ファインチューニングライブラリである。

### torchchat / gpt-fast

**torchchat**はPyTorch向けのLLMを使ったチャット実装であり、**gpt-fast**はPyTorchを使ったLLM実装である。

### PyTorch Hub
**PyTorch Hub** (torch.hub) はGitHubのリポジトリ上に存在するPyTorchの事前学習モデルを簡単に使用できるようにするための仕組みである。リポジトリをこのPyTorch Hubで使えるようにするためにはリポジトリ上に「hubconf.py」を設置する必要がある。

PyTorch Hubに対応しているリポジトリには例えば以下が存在する：
* torchvision ("pytorch/vision")
* Fairseq ("pytorch/fairseq")
* YOLOv5 ("ultralytics/yolov5")

PyTorch Hubでリポジトリ上のモデルを読み込むコードの例：

```python3
import torch
yolov5s_model = torch.hub.load('ultralytics/yolov5', 'yolov5s')
```


なお外部プロジェクトにはGitHub及びPyTorch Hubを使わずに、GitHubに似た独自リポジトリシステムとその読み込みスクリプトを提供するものも存在する（Hugging Face の Hugging Face Hubなど）。

### TorchMetrics

Lightning AI製の評価指標（メトリクス）用ライブラリ。

## 学習

### データローダ
PyTorchに使うことのできるデータローダには以下が存在する：
* DataLoader (torch.utils.data.DataLoader) - PyTorch標準のデータローダ。
* DataLoader2 (torchdata.dataloader2.DataLoader2) - 別パッケージのTorchDataで開発されているDataPipesを基にした実験的なデータローダ。 
* FFCV (Fast Forward Computer Vision; ffcv.loader)
* NVIDIA DALI (Data Loading Library; nvidia.dali.plugin.pytorch) - GPUDirect Storageに対応したデータローダ。PyTorch以外にも対応している。実験的なGPUデータ解凍にも対応している (fn.experimental.inflate)。

またデータセットの自動ダウンロードに対応するデータローダとして HuggingFace Datasets Hub のデータセットが使用可能な HuggingFace 製の Datasets も存在する。

### PyTorch Lightning

**[[PyTorch Lightning]]**は学習から展開までの簡易化のための PyTorch向けサードパーティー製ライブラリである。

### 高速化
より高い効率で学習を行うための様々な標準機能・外部ライブラリが提供されている。以下はその一例である。

それぞれの手法で特徴と適用範囲が異なる。例えばDynamoでは動的条件分岐を扱えるがfx.symbolic_traceでは扱えない。

## 脚注

## 出典

## 参考文献
* 小川雄太郎：「つくりながら学ぶ! PyTorchによる発展ディープラーニング」、マイナビ出版 (2019年7月29日)、ISBN 978-4-8399-7025-3.
* 巣籠悠輔：「詳解ディープラーニング 第2版：TensorFlow/Keras・PyTorchによる時系列データ処理」、マイナビ出版、ISBN 978-4-8399-6951-6 (2019年11月27日).
* 
* Eli Stevens、Luca Antiga、Thomas Viehmann：「PyTorch実践入門：デープラーニングの基礎から実装へ」,マイナビ出版(2021年1月30日）、ISBN 978-4-8399-7469-5.
* 赤石雅典：「最短コースでわかる PyTorch &深層学習プログラミング」、日経BP（2021年9月17日）、ISBN 978-4-29611032-2.
* Sebastian Raschka、Yuxi (Hayden) Liu、Vahid Mirjalili：「Python 機械学習プログラミング [PyTorch ＆ scikit-learn編]」、インプレス (2022年12月21日)、ISBN 978-4-295-01558-1.

## 関連項目

* 
* 
* 
* Tensor
* 人工知能
* ニューラルネットワーク
* ディープラーニング

## 外部リンク
* 
* PyTorchチュートリアル（日本語翻訳版）