金子邦彦研究室人工知能Windows でのインストールと動作確認(人工知能関係)FlexGen のインストールと動作確認(大規模言語モデル,チャットボット)(Python,PyTorch を使用)(Windows 上)

FlexGen のインストールと動作確認(大規模言語モデル,チャットボット)(Python,PyTorch を使用)(Windows 上)

FlexGen のインストールと動作確認を行う.

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

前準備

Git のインストール(Windows 上)

Windows での Git のインストール: 別ページ »で説明

関連する外部ページ

Git の公式ページ: https://git-scm.com/

Python のインストール(Windows 上)

Windows での Python 3.10,関連パッケージ,Python 開発環境のインストール: 別ページ »で説明

サイト内の関連ページ

Python のまとめ: 別ページ »にまとめ

関連する外部ページ

Python の公式ページ: https://www.python.org/

Build Tools for Visual Studio 2022,NVIDIA ドライバ,NVIDIA CUDA ツールキット,NVIDIA cuDNN のインストール(Windows 上)

Windows での Build Tools for Visual Studio 2022NVIDIA ドライバNVIDIA CUDA ツールキット 11.8,NVIDIA cuDNN v8.6 のインストールと動作確認: 別ページ »で説明

関連する外部ページ

PyTorch のインストール(Windows 上)

  1. Windows で,コマンドプロンプト管理者として実行

    コマンドプロンプトを管理者として実行: 別ページ »で説明

  2. PyTorch のページを確認

    PyTorch のページ: https://pytorch.org/index.html

  3. 次のようなコマンドを実行(実行するコマンドは,PyTorch のページの表示されるコマンドを使う).

    次のコマンドは, 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())" 
    

    [image]

FlexGen のインストール

公式ページ https://github.com/FMInference/FlexGen の記載に従う.

  1. Windows で,コマンドプロンプト管理者として実行

    コマンドプロンプトを管理者として実行: 別ページ »で説明

  2. ダウンロードとインストール

    cd %HOMEPATH%
    rmdir /s /q FlexGen
    git clone https://github.com/FMInference/FlexGen.git
    cd FlexGen
    pip3 install -e .
    
  3. 動作確認のため,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 が公開されている.

    実行の結果,エラーメッセージが出ないことを確認

    python -m flexgen.flex_opt --model facebook/opt-1.3b
    

    [image]

チャットボットを動かす(FlexGen,OPT を使用)(Windows 上)

次のコマンドを実行する.プログラム中にプロンプトが記載されている. プログラムの実行により,プロンプトと,回答が表示される.

英語,中国語に対応しているようである.

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 が公開されている.

日本語で使いたい場合のために,Meta の言語モデルと日本語で対話できる chatBOT プログラム(chatBOT)(FlexGen, DeepL, Python を使用)(Windows 上)を,別ページ »で説明

チャットボットに対話,音声合成を行う Python プログラム(FlexGen,OPT を使用)(Windows 上)

  1. Windows で,コマンドプロンプトを実行
  2. エディタを起動
    cd %HOMEPATH%
    notepad qa.py
    
  3. エディタで,次のプログラムを保存
    """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)
    
  4. プログラム実行

    プログラムを qa.pyのようなファイル名で保存したので, 「python c.py --model facebook/opt-125m」のようなコマンドで行う.「opt-125m」のところは,使用するOPT言語モデル名を指定.

    cd %HOMEPATH%
    python qa.py --model facebook/opt-125m