Nobisuke
Dekisugi
RAG
Privacy policy
2024/09/26 07:40
こんにちは、スーパーマイクロさんと弊社の株主のシンデンハイテックスさんのお仕事で最新のGPUを触ってきました!
スーパーマイクロ
シンデンハイテックス
今回のお目当ては、、、、
AMD Instinct™ MI300X
です!このマシンはAMD製なのですが、なんとビデオメモリ(VRAM)が192GBもあります。
かつ現在はスーパーマイクロさん、AMDさんが国内向けに出しているものは8GPU構成のものなので、全部でVRAMが1台で
1.5TBもあります。。。
国内でAMDのGPU向けのアプリケーションを持っている企業がほとんどいないということで、弊社にお声がかかりLLMとRAGと量子計算のソフトを動かしてきました。
まず、AMDではMI300Xという最新のGPUをリリース。これがNVIDIAのH100の1.3倍ほど早く、VRAMも192GBと圧倒的に多いということで一部界隈で話題になっています。
個人的にはこれまでNVIDIAマシンを使ってきたのでAMDは慣れていませんが、最近はpytorchがAMDに対応したROCm(ロックエム)というNVIDIAのCUDAに対応するものが出てきてて、比較的安定して動きます。今回はLLMやRAGや量子計算がきちんと利用できるか検証してきました。
と、通常はMistralやLlama3、Gemma2などを使っているのですが、今回は来る途中の電車の中で新しいLlama3.2が出たとニュースを見ました!
Metaが「Llama 3.2」を公開、画像認識性能が向上&スマホ特化の小型版もあり
最初はあまり深く考えずにMistral7Bをインストール、RAGはベクトルDBにFaissを利用し、Embeddingモデルに適当なものを利用しました。結果、きちんとなんの問題もなく高速に稼働しました。一応速度もベンチマークの比較を取ろうと思いますが、まだできてません。
それはそうと、早速Llama3.2を動かしてみたくなりチャレンジしました。
今回のAMD MI300XはVRAMが192GBあるということで、もしかしたらGPU1枚に90Bが載るのではないかと思い、
meta-llama/Llama-3.2-90B-Vision-Instruct
こちらにチャレンジ。事前に承認が必要なので、早めに申し込んでおいた方がいいです。
モデルパラメータは900億パラメータですので、通常利用している7-9B程度のものとは10倍ほど大きいです。
しかし!これがGPU1枚に乗ってしまうということなので実行してみました。
ダウンロードはかなり時間がかかるので早めに準備をお勧めします。
実際にファイルは、180GB前後ありますのでとてもVRAMに一回に乗る量とは思えません。。。
TransformersをアップデートしてからのHuggingFaceからモデルをダウンロード
今回はちょっと例題が変わっています。
import requests
import torch
from PIL import Image
from transformers import MllamaForConditionalGeneration, AutoProcessor
model_id = "meta-llama/Llama-3.2-90B-Vision-Instruct"
model = MllamaForConditionalGeneration.from_pretrained(
model_id,
torch_dtype=torch.bfloat16,
device_map="auto",
)
processor = AutoProcessor.from_pretrained(model_id)
url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/0052a70beed5bf71b92610a43a52df6d286cd5f3/diffusers/rabbit.jpg"
image = Image.open(requests.get(url, stream=True).raw)
messages = [
{"role": "user", "content": [
{"type": "image"},
{"type": "text", "text": "If I had to write a haiku for this one, it would be: "}
]}
]
input_text = processor.apply_chat_template(messages, add_generation_prompt=True)
inputs = processor(image, input_text, return_tensors="pt").to(model.device)
output = model.generate(**inputs, max_new_tokens=30)
print(processor.decode(output[0]))
今回はどうやらLlama3.1のテキストモデルの上にビジョンモデルが作られたようです。
サンプルコードもピーターラビットの画像を見て俳句を書くというものでした。
AMD対応のGPUで動かす場合、注意点は一つだけでpytorchをROCm対応のものに置き換える必要があります。
Installing PyTorch for ROCm
これだけであとはNVIDIAの時と同じコードが動きます。特にエラーも出ませんでした。
実際に動かすと。。。とにかくVRAMに余裕があるので全く量子化などの軽量化をすることなく実行できます。
deviceの設定をしないとCPUにオフロードされてしまったので、その点はGPUを使うのできちんとdevice設定が必要でした。
実際に英語でなんかよくわからないハリーポッターに出てきそうな俳句が出てきました。
実行時間はmax new tokenの設定にもよりますが、3秒の時もあれば20秒程度の時もありました。
サンプルコードではmax new tokenがかなり小さめなので、実際には拡張したりして使ってみました。
日本語でも同じ画像から、画像を見て俳句を作ってと言ったところ特に違和感のない感じでできました。
(借りた検証機を使っていたでのテキストがコピペできなくて、貼れないので雰囲気ですみません。)
今回のマシンでは8GPUですが、90Bでも1GPUで行けました。
設定はcuda:0のように同じように行けます。
また、device mapをautoにすると自動設定ですがどれが使われているのかわからないので細かい検証はできませんが、
遅くなったり早くなったり、しかし全体としては数秒程度の違いであまり大きな違いはありませんでした。
結論としてネットワーク経由でウェイトのダウンロードがかなり時間がかかりますので、
8GPUのAMDのMI300Xを1.5TBのVRAMを使い切るのはかなり大変です。
HPCなど問題が同一でサイズを大きくしたりして計算量を使いたい場合には使い切れるかもですが、
LLMみたいにモデルサイズが一定でVRAMにロードして使うタイプのものについては192GBが1GPUで取れる時点でかなりのスペックで
現時点での最高性能に近いものは使い切るのにもそれなりの腕や学習などの用途が必要だと感じました。推論だけだとちょっと使いきれないか、
複数人で使うものかもしれません。
お値段も高くない(業界的には)のでGPUを検討している企業で追いつきたい企業は(検証の上で)買ってもいいのではないかと感じました。
お問い合わせは窓口がシンデンハイテックスさんなのでそちらへ。
最先端ハードを体験できてすごかったです。
性能使い切れるように頑張ります。
© 2024, blueqat Inc. All rights reserved