# 速度比較

    <img
        alt="Open In Colab"
        class="!m-0"
        src="https://colab.research.google.com/assets/colab-badge.svg"
    />

`Safetensors` は非常に高速です。[gpt2](https://huggingface.co/gpt2) の重みを読み込むことで、`PyTorch` と比較してみましょう。[GPU ベンチマーク](#gpu-benchmark) を実行するには、お使いのマシンに GPU が搭載されているか、Google Colab を使用している場合は `GPU runtime` が選択されていることを確認してください。

開始する前に、必要なライブラリがすべてインストールされていることを確認してください。

```bash
pip install safetensors huggingface_hub torch
```

使用されるすべてのパッケージをインポートすることから始めましょう:

```py
>>> import os
>>> import datetime
>>> from huggingface_hub import hf_hub_download
>>> from safetensors.torch import load_file
>>> import torch
```

gpt2のsafetensorsおよびtorchの重みをダウンロードします:

```py
>>> sf_filename = hf_hub_download("gpt2", filename="model.safetensors")
>>> pt_filename = hf_hub_download("gpt2", filename="pytorch_model.bin")
```

### CPUベンチマーク

```py
>>> start_st = datetime.datetime.now()
>>> weights = load_file(sf_filename, device="cpu")
>>> load_time_st = datetime.datetime.now() - start_st
>>> print(f"Loaded safetensors {load_time_st}")

>>> start_pt = datetime.datetime.now()
>>> weights = torch.load(pt_filename, map_location="cpu")
>>> load_time_pt = datetime.datetime.now() - start_pt
>>> print(f"Loaded pytorch {load_time_pt}")

>>> print(f"on CPU, safetensors is faster than pytorch by: {load_time_pt/load_time_st:.1f} X")
Loaded safetensors 0:00:00.004015
Loaded pytorch 0:00:00.307460
on CPU, safetensors is faster than pytorch by: 76.6 X
```

この高速化は、このライブラリがファイルを直接マッピングすることで不要なコピーを回避するためです。実際には、[pure pytorch](https://gist.github.com/Narsil/3edeec2669a5e94e4707aa0f901d2282)でも可能です。現在示されている高速化は、以下の環境で得られました：
* OS: Ubuntu 18.04.6 LTS
* CPU: Intel(R) Xeon(R) CPU @ 2.00GHz

### GPUベンチマーク

```py
>>> # This is required because this feature hasn't been fully verified yet, but 
>>> # it's been tested on many different environments
>>> os.environ["SAFETENSORS_FAST_GPU"] = "1"

>>> # CUDA startup out of the measurement
>>> torch.zeros((2, 2)).cuda()

>>> start_st = datetime.datetime.now()
>>> weights = load_file(sf_filename, device="cuda:0")
>>> load_time_st = datetime.datetime.now() - start_st
>>> print(f"Loaded safetensors {load_time_st}")

>>> start_pt = datetime.datetime.now()
>>> weights = torch.load(pt_filename, map_location="cuda:0")
>>> load_time_pt = datetime.datetime.now() - start_pt
>>> print(f"Loaded pytorch {load_time_pt}")

>>> print(f"on GPU, safetensors is faster than pytorch by: {load_time_pt/load_time_st:.1f} X")
Loaded safetensors 0:00:00.165206
Loaded pytorch 0:00:00.353889
on GPU, safetensors is faster than pytorch by: 2.1 X
```

この高速化は、このライブラリが不要なCPU上のメモリ割り当てをスキップできるため機能します。現時点で私たちが知る限り、純粋なPyTorchでは再現できません。このライブラリは、ファイルをメモリマップし、PyTorchで空のテンソルを作成し、`cudaMemcpy`を直接呼び出してテンソルをGPUに直接移動することで動作します。現在示されている高速化は、以下の環境で得られました:
* OS: Ubuntu 18.04.6 LTS
* GPU: Tesla T4
* Driver Version: 460.32.03
* CUDA バージョン: 11.2

