FlexGen のインストールと動作確認を行う.
FlexGen は,大規模言語モデル (large language model)を用いた推論で必要とされる計算とメモリの要求を削減する技術. 実験では,大規模言語モデル OPTOPT-175B を,16GB の単一 GPU で実行したとき 100倍以上の高速化が可能であるとされている.
【文献】 Ying Sheng, Lianmin Zheng, Binhang Yuan, Zhuohan Li, Max Ryabinin, Beidi Chen, Percy Liang, Ce Zhang, Ion Stoica, Christopher Ré., High-throughput Generative Inference of Large Language Model with a Single GPU, 2023.
PDF ファイル: https://github.com/FMInference/FlexGen/blob/main/docs/paper.pdf
【サイト内の関連ページ】
【関連する外部ページ】
FlexGen の GitHub のページ: https://github.com/FMInference/FlexGen
【関連項目】 OPT
Windows での Git のインストール: 別ページ »で説明
【関連する外部ページ】
Git の公式ページ: https://git-scm.com/
Windows での Python 3.10,関連パッケージ,Python 開発環境のインストール: 別ページ »で説明
【サイト内の関連ページ】
Python のまとめ: 別ページ »にまとめ
【関連する外部ページ】
Python の公式ページ: https://www.python.org/
Windows での Build Tools for Visual Studio 2022,NVIDIA ドライバ,NVIDIA CUDA ツールキット 11.8,NVIDIA cuDNN v8.6 のインストールと動作確認: 別ページ »で説明
【関連する外部ページ】
コマンドプロンプトを管理者として実行: 別ページ »で説明
PyTorch のページ: https://pytorch.org/index.html
次のコマンドは, PyTorch 2.0 (NVIDIA CUDA 11.8 用) をインストールする. 事前に NVIDIA CUDA のバージョンを確認しておくこと(ここでは,NVIDIA CUDA ツールキット 11.8 が前もってインストール済みであるとする).
PyTorch で,GPU が動作している場合には,「torch.cuda.is_available()」により,True が表示される.
python -m pip install -U pip python -m pip install -U torch torchvision torchaudio numpy --index-url https://download.pytorch.org/whl/cu118 python -c "import torch; print(torch.__version__, torch.cuda.is_available())"
公式ページ https://github.com/FMInference/FlexGen の記載に従う.
コマンドプロンプトを管理者として実行: 別ページ »で説明
cd %HOMEPATH% rmdir /s /q FlexGen git clone https://github.com/FMInference/FlexGen.git cd FlexGen pip3 install -e .
OPT (Open Pre-Trained Transformer) は,事前学習済みの大規模言語モデル (large language model) である.GitHub のページでは,OPT-125M, OPT-350M, OPT-1.3B, OPT-2.7B, OPT-6.7B, OPT-13B, OPT-30B, OPT-66B, OPT-175B が公開されている.
実行の結果,エラーメッセージが出ないことを確認
python -m flexgen.flex_opt --model facebook/opt-1.3b
次のコマンドを実行する.プログラム中にプロンプトが記載されている. プログラムの実行により,プロンプトと,回答が表示される.
英語,中国語に対応しているようである.
OPT (Open Pre-Trained Transformer) は,事前学習済みの大規模言語モデル (large language model) である.GitHub のページでは,OPT-125M, OPT-350M, OPT-1.3B, OPT-2.7B, OPT-6.7B, OPT-13B, OPT-30B, OPT-66B, OPT-175B が公開されている.
cd %HOMEPATH% cd FlexGen cd flexgen cd apps python completion.py --model facebook/opt-125m
OPT-125M より大きなメモリが必要.メモリが足りない場合には動かない
cd %HOMEPATH% cd FlexGen cd flexgen cd apps python completion.py --model facebook/opt-6.7b
日本語で使いたい場合のために,Meta の言語モデルと日本語で対話できる chatBOT プログラム(chatBOT)(FlexGen, DeepL, Python を使用)(Windows 上)を,別ページ »で説明
cd %HOMEPATH% notepad qa.py
"""Run a chatBOT with FlexGen and OPT models.""" import argparse import sys import win32com.client import flexgen from flexgen.flex_opt import (Policy, OptLM, ExecutionEnv, CompressionConfig, str2bool) from transformers import AutoTokenizer speech = win32com.client.Dispatch("Sapi.SpVoice") def main(args): # Initialize environment env = ExecutionEnv.create(args.offload_dir) # Offloading policy policy = Policy(1, 1, args.percent[0], args.percent[1], args.percent[2], args.percent[3], args.percent[4], args.percent[5], overlap=True, sep_layer=True, pin_weight=args.pin_weight, cpu_cache_compute=False, attn_sparsity=1.0, compress_weight=args.compress_weight, comp_weight_config=CompressionConfig( num_bits=4, group_size=64, group_dim=0, symmetric=False), compress_cache=args.compress_cache, comp_cache_config=CompressionConfig( num_bits=4, group_size=64, group_dim=2, symmetric=False)) # Model print("Initialize...") tokenizer = AutoTokenizer.from_pretrained("facebook/opt-30b", padding_side="left") tokenizer.add_bos_token = False stop = tokenizer("\n").input_ids[0] model = OptLM(args.model, env, args.path, policy) context = ( "A chat between a curious human and a knowledgeable artificial intelligence assistant.\n" "Human: Hello! What can you do?\n" "Assistant: As an AI assistant, I can answer questions and chat with you.\n" ) # Chat print(context, end="") while True: inp = input("Human: ") if not inp: print("exit...") break speech.Speak(inp) context += "Human: " + inp + "\n" inputs = tokenizer([context]) output_ids = model.generate( inputs.input_ids, do_sample=True, temperature=0.7, max_new_tokens=96, stop=stop) outputs = tokenizer.batch_decode(output_ids, skip_special_tokens=True)[0] try: index = outputs.index("\n", len(context)) except ValueError: outputs += "\n" index = outputs.index("\n", len(context)) outputs = outputs[:index + 1] print(outputs[len(context):], end="") speech.Speak(outputs[len(context):]) context = outputs # TODO: optimize the performance by reusing context cache and reducing redundant computation. # Shutdown env.close_copy_threads() if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--model", type=str, default="facebook/opt-6.7b", help="The model name.") parser.add_argument("--path", type=str, default="~/opt_weights", help="The path to the model weights. If there are no cached weights, " "FlexGen will automatically download them from HuggingFace.") parser.add_argument("--offload-dir", type=str, default="~/flexgen_offload_dir", help="The directory to offload tensors. ") parser.add_argument("--percent", nargs="+", type=int, default=[100, 0, 100, 0, 100, 0], help="Six numbers. They are " "the percentage of weight on GPU, " "the percentage of weight on CPU, " "the percentage of attention cache on GPU, " "the percentage of attention cache on CPU, " "the percentage of activations on GPU, " "the percentage of activations on CPU") parser.add_argument("--pin-weight", type=str2bool, nargs="?", const=True, default=True) parser.add_argument("--compress-weight", action="store_true", help="Whether to compress weight.") parser.add_argument("--compress-cache", action="store_true", help="Whether to compress cache.") args = parser.parse_args() assert len(args.percent) == 6 main(args)
プログラムを qa.pyのようなファイル名で保存したので, 「python c.py --model facebook/opt-125m」のようなコマンドで行う.「opt-125m」のところは,使用するOPT言語モデル名を指定.
cd %HOMEPATH% python qa.py --model facebook/opt-125m