Hugging FaceモデルをUbuntuで動かす!自前LLM構築ガイド (2) モデルセットアップ編

未分類

関連記事

はじめに

当記事ではHuggingFaceからモデルをロードし、実際に推論を行います。

事前準備

Hugging Faceアカウント

Hugging Faceアカウントが必要です。
事前に以下より取得してください。

Hugging Face – The AI community building the future.
We’re on a journey to advance and democratize artificial intelligence through open source and open science.

python3-devとbuild-essentialをインストール

以下のパッケージが必要となるため、インストールします。

sudo apt install python3-dev build-essential

仮想環境の作成と有効化

今回はユーザーディレクトリの配下にllmという名前のディレクトリを作成して作業します。

cd /home/ai-stack/
mkdir llm
cd llm
python3 -m venv llm-env

# 仮想環境を有効化
source llm-env/bin/activate

# プロンプトが (llm-env) に変わればOK

必要パッケージのインストール

pip install --upgrade pip
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124
pip install transformers accelerate huggingface_hub python-dotenv bitsandbytes sentencepiece
  • PyTorch は GPU (CUDA 12) に対応したものを指定
  • huggingface_hub は Hugging Face Hub との連携用

モデルセットアップ

ファイル構成

今回はelyza/Llama-3-ELYZA-JP-8Bというモデルを設定します。

elyza/Llama-3-ELYZA-JP-8Bは、Meta社の「Llama 3」モデルをベースに、株式会社ELYZA(エライザ)が日本語向けにチューニングしたものです。

以下のスクリプトを作成して、モデルのロード・推論テストを行います。

/home/ai-stack/llm/llama3-elyza-8b/
├── .env                      # 環境変数設定ファイル
├── model_loader.py           # モデル読込専用モジュール
├── 01_setup_model.py         # モデルのセットアップ・初期化
├── 02_infer_test.py          # 推論テストコード
└── ./cache                   # モデルキャッシュファイル

HuggingFaceトークンの設定

まずは以下の手順でトークンを取得します。

1) Access Token の取得

1. Hugging Face にログイン
2. 「Settings → Access Tokens → New Token」からトークン作成
3. Scope は `read` を選択
トークンは作成時しか取得できないため、メモしておいてください。

スクリプトの配置

/home/ai-stack/llm 直下に llama3-elyza-8b ディレクトリを作成します。

cd /home/ai-stack/llm
mkdir llama3-elyza-8b
cd llama3-elyza-8b

/home/ai-stack/llm/llama3-elyza-8b/ 以下に以下のファイルを配置します。

.env

MODEL_NAME=elyza/Llama-3-ELYZA-JP-8B
CACHE_DIR=./cache
HUGGINGFACE_HUB_TOKEN=[取得したHuggingFaceのトークン]

model_loader.py

"""
モデルとトークナイザーの読み込みユーティリティ
"""
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
from typing import Tuple, Optional

def load_tokenizer_only(
    model_name: str,
    cache_dir: str,
    use_fast: bool = False
) -> AutoTokenizer:
    """
    トークナイザーのみを読み込む

    Args:
        model_name: モデル名
        cache_dir: キャッシュディレクトリ
        use_fast: 高速トークナイザーを使用するか

    Returns:
        tokenizer: トークナイザー
    """
    tokenizer = AutoTokenizer.from_pretrained(
        model_name,
        cache_dir=cache_dir,
        use_fast=use_fast
    )
    print(f"✅ トークナイザー読み込み完了: {model_name}")
    return tokenizer


def load_model_only(
    model_name: str,
    cache_dir: str,
    device_map: str = "auto",
    dtype: torch.dtype = torch.float16
) -> AutoModelForCausalLM:
    """
    モデルのみを読み込む

    Args:
        model_name: モデル名
        cache_dir: キャッシュディレクトリ
        device_map: デバイス配置
        dtype: モデルのデータ型

    Returns:
        model: モデル
    """
    model = AutoModelForCausalLM.from_pretrained(
        model_name,
        cache_dir=cache_dir,
        device_map=device_map,
        dtype=dtype
    )
    print(f"✅ モデル読み込み完了: {model_name}")
    return model

01_setup_model.py

from huggingface_hub import login
from transformers import AutoModelForCausalLM, AutoTokenizer
from dotenv import load_dotenv
from model_loader import load_tokenizer_only, load_model_only
import os
import torch

load_dotenv()

# モデル設定
model_name = os.getenv("MODEL_NAME")
cache_dir = os.getenv("CACHE_DIR")
hf_token = os.getenv("HUGGINGFACE_HUB_TOKEN")

if not model_name:
    raise ValueError("環境変数 MODEL_NAME が設定されていません。")
if not cache_dir:
    raise ValueError("環境変数 CACHE_DIR が設定されていません。")
if not hf_token:
    raise ValueError("環境変数 HUGGINGFACE_HUB_TOKEN が設定されていません。")

# ログイン
login(token=hf_token)

# GPUメモリをクリア
if torch.cuda.is_available():
    torch.cuda.empty_cache()
    print(f"GPU: {torch.cuda.get_device_name(0)}")
    print(f"使用可能メモリ: {torch.cuda.get_device_properties(0).total_memory / 1024**3:.2f} GB")

# トークナイザー
tokenizer = load_tokenizer_only(
    model_name=model_name,
    cache_dir=cache_dir,
    use_fast=False
)

# モデル
model = load_model_only(
    model_name=model_name,
    cache_dir=cache_dir,
    device_map="auto",
    dtype=torch.float16
)

print(f"✅ ダウンロード完了: {cache_dir}")

# モデル情報を表示
print(f"モデルタイプ: {model.config.model_type}")
print(f"パラメータ数: {model.num_parameters() / 1e9:.2f}B")
print(f"デバイス配置: {model.hf_device_map if hasattr(model, 'hf_device_map') else 'N/A'}")

# トークナイザーも保存(推論時に便利)
tokenizer.save_pretrained(cache_dir)
print(f"トークナイザーも保存: {cache_dir}")

02_infer_test.py

from transformers import AutoModelForCausalLM, AutoTokenizer
from dotenv import load_dotenv
from model_loader import load_tokenizer_only, load_model_only
import os
import torch

load_dotenv()

# モデル設定
model_name = os.getenv("MODEL_NAME")
cache_dir = os.getenv("CACHE_DIR")

print("=== モデルをロード中 ===")

# トークナイザー
tokenizer = load_tokenizer_only(
    model_name=model_name,
    cache_dir=cache_dir,
    use_fast=False
)

# モデル
model = load_model_only(
    model_name=model_name,
    cache_dir=cache_dir,
    device_map="auto",
    dtype=torch.float16
)

print("✅ モデルロード完了")
print(f"デバイス: {next(model.parameters()).device}")

# テスト推論
def generate_text(prompt, max_length=100):
    # Llamaモデル用の入力形式
    inputs = tokenizer(prompt, return_tensors="pt").to(model.device)

    with torch.no_grad():
        outputs = model.generate(
            **inputs,
            max_length=max_length,
            do_sample=True,
            temperature=0.7,
            top_p=0.95,
            pad_token_id=tokenizer.pad_token_id,
            bos_token_id=tokenizer.bos_token_id,
            eos_token_id=tokenizer.eos_token_id
        )

    return tokenizer.decode(outputs[0], skip_special_tokens=True)

# 実行例
if __name__ == "__main__":
    prompts = [
        """AさんはBさんより背が高い。CさんはAさんより背が低い。
では、最も背が高いのは誰ですか?
"""
    ]

    for prompt in prompts:
        print(f"\n{'='*50}")
        print(f"プロンプト: {prompt}")
        print(f"{'='*50}")

        result = generate_text(prompt, max_length=1000)
        print(result)

モデルのダウンロード

以下を実行して、モデルとトークナイザーをロードします。
(10分~20分程度時間がかかると思います)

python3 01_setup_model.py

モデルとトークナイザーをロード

トークナイザー(Tokenizer)」とは、テキストをモデルが理解できる形式に変換するツールです。
LLM(大規模言語モデル)は文字や単語そのままでは理解できず、数値(トークン)に変換する必要があります。
この変換を行うのがトークナイザーです。

推論テスト

以下を実行して、推論のテストを行います。
回答が表示されたら成功です。

python3 02_infer_test.py

以下のような結果になりました。
推論テスト
最も背の高い人がAさんというのは正解ですが、最も背が低い人まで答えてしまっていますね。。。

仮想環境の終了

仮想環境を終了する際は、以下を実行します。

deactivate

まとめ

本記事では、Hugging Face上の日本語特化モデル 「elyza/Llama-3-ELYZA-JP-8B」 をUbuntu環境にセットアップし、実際に推論を実行するまでの手順を解説しました。

Pythonの仮想環境を構築し、必要パッケージをインストールすることで、
GPUを活用したローカルLLM推論環境が整い、
インターネット接続がなくても高速な日本語応答が可能になります。

次回は、取得したモデルをベースに LoRAを用いたファインチューニング を行い、
独自データに最適化した自前LLMを構築します。

コメント

タイトルとURLをコピーしました