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

PyTorch には 32bit 浮動小数点数用の FloatTensor や 16bit 浮動小数点数用の HalfTensor 、32bit 整数用の 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などのテンソル）も存在している。量子化テンソルはスケールやゼロポイントなどの量子化パラメータを持っている。なお4bit量子化向けのdtype=torch.quint4x2のテンソルもあるが、2023年現在その対応は一部（EmbeddingBag命令）のみとなっている。また8bit浮動小数点数向けの torch.float8_e4m3fn 及び torch.float8_e5m2 のテンソルにも対応しているが対応命令はごく一部となっている[（8bit浮動小数点数は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エポックの計算にかかる時間を節約することができる。

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

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

 jitモジュール 
TorchScriptとして後述。

 バックエンド 

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

また PyTorch にはCPUだけでなくGPUバックエンドもあり、NVIDIA製GPU向けにはCUDAで、AMD製GPU向けにはのHIPで、Intel製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）。