😎
M1 MacBook でCPUとGPU(MPS)のどちらが早く文章をベクトル化できるか
概要
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