😎

M1 MacBook でCPUとGPU(MPS)のどちらが早く文章をベクトル化できるか

2024/02/01に公開

概要

MacBookで文章をベクトル化するときに、CPUとGPUのどちらが早く処理できるかあたり評価を行った。
文章が短いときはCPUが早い。
ただし、モデルにもよって異なるので用途によって検討必要。

環境

item spec
pc M1 MacBook
OS 14.2.1
python 3.11.5
torch 2.1.2
transformers 4.37.2
model intfloat/multilingual-e5-small

コード(の一部)

# トークナイズするテキスト
        texts = [ ここの文字列は評価によって変える ]

        start_time = time.time()

        # テキストをトークン化し、PyTorchのテンソルに変換してGPUを使っている場合はGPUに転送
        tokenized_texts = tokenizer(
            texts, padding=True, truncation=True, return_tensors="pt", max_length=512
        )

        print(f"トークン化にかかった時間: {time.time() - start_time}秒")

        transfer_gpu_start_time = time.time()
        if device.type == "mps":
            tokenized_texts = {k: v.to(device) for k, v in tokenized_texts.items()}
            print(f"GPU転送にかかった時間: {time.time() - transfer_gpu_start_time}秒")

        embeddings_start_time = time.time()
        # メモリ使用量を削減するため勾配計算は行わずにトークンをモデルに通して出力を得る
        with torch.no_grad():
            outputs = model(**tokenized_texts)
            embeddings = outputs.last_hidden_state.mean(dim=1)
            print(f"ベクトル化にかかった時間: {time.time() - embeddings_start_time}秒")

        # 時間計測を終了し、結果を表示
        print(f"全体処理にかかった時間: {time.time() - start_time}秒")

測定結果

単位は秒。

362文字を10個処理する

以下の文字列をtextsに10個放り込んで処理する。
GPUの勝ち。

ゴーシュはゴーシュの病気曲たちから町はずれで見眼でした。するとひっそりまじめましたというバケツたまし。上手たな方うはたするとホールの大丈夫館のときをはどうも正確ないんて、それでもギウギウを云いせのだた。まわりすぎやつはゴーシュが遅くませがさっきの狸のかっこうらをつかまえる第万音楽らのかっこうが弾いていたや。ボックスは今夜呑みからいまい。へんは十しかっこうのようからちがわていなら。ゴーシュは屋根裏ねどこたりそれを叩かとやるた。巻は鳥にこうにつまずくが鳥からベロリのようがいってドレミファからやってとうとうょってじぶんのからしていた。そのままどうもゴーシュに音楽がつかれたた。それいきなりにとんとんへ来が鳥が出なた。先生がくわえますた。「口を続けだ。棒、何からおっかさん。呆れ。」何はさっきのところのまだ前のときがいったた。

CPU

項目 1回目 2回目 3回目 平均
トークン化 0.0030 0.0025 0.0026 0.0027
ベクトル化 0.1659 0.1355 0.1354 0.1456
全体 0.1690 0.1381 0.1380 0.1484

GPU

項目 1回目 2回目 3回目 平均
トークン化 0.0031 0.0022 0.0021 0.0025
GPU転送 0.0039 0.0030 0.0009 0.0026
ベクトル化 0.0278 0.0231 0.0205 0.0238
全体 0.0349 0.0284 0.0236 0.0290

362文字を1個処理する

前述の文字列をtextsに1個だけ放り込んで処理する。
GPUの勝ち。

CPU

項目 1回目 2回目 3回目 平均
トークン化 0.0005 0.0007 0.0005 0.0005
ベクトル化 0.0578 0.0658 0.0576 0.0604
全体 0.0583 0.0665 0.0582 0.0610

GPU

項目 1回目 2回目 3回目 平均
トークン化 0.0021 0.0004 0.0017 0.0014
GPU転送 0.0032 0.0032 0.0029 0.0031
ベクトル化 0.0367 0.0231 0.0371 0.0323
全体 0.0421 0.0270 0.0418 0.0370

28文字を1個処理する

以下の文字列をtextsに1個だけ放り込んで処理する。
CPUの勝ち。

"ゴーシュはゴーシュの病気曲たちから町はずれで見眼でした。"

CPU

項目 1回目 2回目 3回目 平均
トークン化 0.0003 0.0003 0.0003 0.0003
ベクトル化 0.0197 0.0148 0.0141 0.0159
全体 0.0190 0.0152 0.0144 0.0162

GPU

項目 1回目 2回目 3回目 平均
トークン化 0.0006 0.0003 0.0002 0.0003
GPU転送 0.0031 0.0008 0.0029 0.0023
ベクトル化 0.0337 0.0205 0.0200 0.0247
全体 0.0374 0.0217 0.0232 0.0274

Discussion