高性能かつ軽量の日本語・英語双方向翻訳AI「FuguMT」を、Windows環境でグラボで動かす方法を紹介します。
消費VRAM量が1GBに満たないので、どんなGPUでもできそうです。
(Nvidia製でCUDAコアが搭載されていればの話)
あわせて、CPU実行時と比べてどのくらい高速化したのかも検証しました。
1. 導入:FuguMTをとりあえず動くようにする
Windowsへのインストール
こちらのページを参考にして、Windowsで動くようにセットアップを行ってください。
画像付きで丁寧に解説しているので、特に迷うこともなく導入できます。
なお、セットアップ完了までの所要時間は5分程度です。
動作確認用コード
import string
from transformers import pipeline
def is_halfwidth(s): # 半角のみならTrue
return all(
c in string.ascii_letters + string.digits + string.punctuation + " " for c in s
)
ej_translator = pipeline("translation", model="staka/fugumt-en-ja")
je_translator = pipeline("translation", model="staka/fugumt-ja-en")
while True:
input_text = input("翻訳したい文章入力(enかjaか自動判別します): ")
if is_halfwidth(input_text) == True:
result = ej_translator(input_text)
elif is_halfwidth(input_text) == False:
result = je_translator(input_text)
print("=" * 15, "翻訳後", "=" * 15)
print(str(result).replace("[{'translation_text': '", "").replace("'}]", "") + "\n")
上記のコードをコピペして、拡張子を「.py」にして保存します。
そしてその.pyファイルを実行すればこのように翻訳が行える様になっているはずです。
翻訳したい文章入力(enかjaか自動判別します): What anime do you like
=============== 翻訳後 ===============
どんなアニメが好きですか?
翻訳したい文章入力(enかjaか自動判別します): 面白いアニメを知っていますか?
=============== 翻訳後 ===============
Do you know any interesting anime?
翻訳したい文章入力(enかjaか自動判別します):
次はこれをCUDAで動くようにします。
2. グラボで動くようにしたコピペ用コード
ほとんど変更はありません。
CUDAデバイス(グラボ)でpipelineを実行する際は、device=0とすれば良いので、それを付け足しただけです。
- 変更前:pipeline(“translation”, model=”staka/fugumt-en-ja”)
- 変更後:pipeline(“translation”, model=”staka/fugumt-en-ja”, device=0)
import string
from transformers import pipeline
def is_halfwidth(s): # 半角のみならTrue
return all(
c in string.ascii_letters + string.digits + string.punctuation + " " for c in s
)
ej_translator = pipeline("translation", model="staka/fugumt-en-ja", device=0)
je_translator = pipeline("translation", model="staka/fugumt-ja-en", device=0)
while True:
input_text = input("翻訳したい文章入力(enかjaか自動判別します): ")
if is_halfwidth(input_text) == True:
result = ej_translator(input_text)
elif is_halfwidth(input_text) == False:
result = je_translator(input_text)
print("=" * 15, "翻訳後", "=" * 15)
print(str(result).replace("[{'translation_text': '", "").replace("'}]", "") + "\n")
これでグラボを用いてFuguMTを動かせます。
3. 翻訳中のGPU負荷と翻訳速度
VRAM消費量
VRAM消費量は、およそ0.8GB程度でした。
負荷が小さくて助かります。
翻訳速度をCPUでの時と比較
雑に指定数翻訳を繰り返して所要時間を出すコードを書きました。
device=0の有無でそれぞれ実行しました。
初回実行時はモデルロードで遅くなるので、2回め以降の翻訳所要時間を見るために、回数も指定できるようにしました。
検証時のコードと様子
import time
def translate(input_text):
import string
from transformers import pipeline
def is_halfwidth(s): # 半角のみならTrue
return all(
c in string.ascii_letters + string.digits + string.punctuation + " "
for c in s
)
ej_translator = pipeline("translation", model="staka/fugumt-en-ja")
je_translator = pipeline("translation", model="staka/fugumt-ja-en")
if is_halfwidth(input_text) == True:
result = ej_translator(input_text)
elif is_halfwidth(input_text) == False:
result = je_translator(input_text)
return result
while True:
input_text = input("翻訳したい文章入力(enかjaか自動判別します): ")
input_num = int(input("繰り返し数:"))
# 処理の開始時刻を記録
start_time = time.time()
# 処理Xを1000回実行
for i in range(input_num):
translate(input_text)
# 処理の終了時刻を記録
end_time = time.time()
# 所要時間を計算して表示
elapsed_time = end_time - start_time
print(
f"所要時間: {elapsed_time:.2f}秒(翻訳回数{input_num}回)\n一回あたり{elapsed_time/input_num}秒"
)
こんな感じで10回翻訳時の平均所要時間を算出しました。
翻訳中のハードウェアの負荷推移です。
CPU時。
GPU時。
結果 意外と僅差どころか……?!
結果は、次のとおりです。
1回あたりの平均所要時間をまとめました。
列1 | Ja→En | En→Ja |
CPU | 3.330408216 | 3.334136987 |
GPU | 3.422847795 | 3.385076642 |
つまり、有意差はなさそうです。
というわけで、GPUで動かす利点は特にありません。
それに、GPUで動かす場合でも、モデルを一度はRAM上に置き、さらにVRAM上に置きなおす以上、必要なRAM量はCPUの時と一緒のハズです。
(何故かGPU使用時もずっとRAM1.6GB程度消費されるしグラボ実行の利点まるでないですね。。。)
1文3秒という超高速翻訳をCPUでもGPUでも実現できる!!と肯定的に捉えておきます。
FuguMTを翻訳用ローカルAPIサーバーとして使用する方法もご覧ください!!
他にも色々面白いAIを動かしているので、是非合わせてご覧ください!!