LabHub

ブログ

オープンソースLLM完全ガイド:Llama 3、Mistral、DeepSeek、Qwen、Gemma総まとめ

한국어English日本語

オープンソース LLM 完全整理 (2024-2026)

2024 年と 2025 年は、オープンソース LLM の歴史で最も激動の時期だった。Meta の Llama 3 が GPT-3.5 を超え、DeepSeek が GPT-4 級の性能をオープンソースで公開して AI 業界を揺るがした。本ガイドでは主要なオープンソース LLM を、アーキテクチャ、性能、ライセンス、活用法まで総整理する。


1. オープンソース LLM エコシステムの概要

クローズドソース vs オープンソースのトレンド

2023 年初頭まではGPT-4 や Claude のようなクローズドソースモデルが性能で圧倒的だった。しかしオープンソース陣営が急速に追いつき、2024 年下半期には複数のオープンソースモデルが GPT-4 水準に到達した。

オープンソース LLM の利点:

オープンソース LLM の限界:

主な発展のタイムライン

ライセンスの分類

ライセンス代表モデル商用利用改変配布
Apache 2.0Mistral, Gemma, Phi可能可能
Meta Llama LicenseLlama シリーズ条件付きで可条件付き
MIT一部の Phi モデル可能可能
独自ライセンスDeepSeek条件付き制限あり

Llama ライセンスの主な制約: 月間アクティブユーザーが 7 億人以上のサービスは別途契約が必要。


2. Meta Llama シリーズ

Llama の発展の経緯

Llama 1 (2023.02): 7B, 13B, 33B, 65B パラメータ。学術研究用に公開されたが、すぐに流出してコミュニティへ広がった。

Llama 2 (2023.07): 7B, 13B, 70B。商用利用が許可された。Chat 版と Code 版を含む。

Llama 3 (2024.04): 8B, 70B。128K の語彙辞書、GQA を適用。前世代に比べて性能が大きく向上した。

Llama 3.1 (2024.07): 8B, 70B, 405B。128K コンテキストウィンドウ、多言語対応の強化、関数呼び出しのネイティブ対応。

Llama 3.2 (2024.09): 1B, 3B (小型)、11B, 90B (マルチモーダル)。ビジョンモデルを含む。

Llama 3.3 (2024.12): 70B。405B 水準の性能を 70B で達成した。

Llama 3 のアーキテクチャ革新

# Llama 3 アーキテクチャの主な特徴
architecture_features = {
    "語彙辞書サイズ": "128,256 トークン (Llama 2 の 4 倍)",
    "位置エンコーディング": "RoPE (Rotary Position Embedding)",
    "アテンション機構": "GQA (Grouped Query Attention)",
    "活性化関数": "SwiGLU",
    "コンテキストウィンドウ": "8K (Llama 3) / 128K (Llama 3.1+)",
    "学習データ": "15T+ トークン",
}

RoPE (Rotary Position Embedding)

絶対位置エンコーディングの代わりに、相対的な位置を回転行列で表現する。長いコンテキストへの一般化に有利である。

GQA (Grouped Query Attention)

Multi-Head Attention(MHA) の変形で、複数のクエリヘッドが一つのキー/バリューヘッドを共有する。推論速度とメモリ効率が大きく向上する。

# Multi-Head Attention vs GQA の比較
mha_params = {
    "query_heads": 32,
    "key_heads": 32,     # クエリと同一
    "value_heads": 32,   # クエリと同一
}

gqa_params = {
    "query_heads": 32,
    "key_heads": 8,      # グループあたり 1 個
    "value_heads": 8,    # グループあたり 1 個
    "メモリ節約": "4 倍"
}

Llama 3 の実践的な使い方

# HuggingFace 経由での Llama 3 の利用
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
import torch

model_id = "meta-llama/Meta-Llama-3-8B-Instruct"

# 4 ビット量子化 (メモリ節約)
from transformers import BitsAndBytesConfig

quantization_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_compute_dtype=torch.bfloat16,
    bnb_4bit_use_double_quant=True,
    bnb_4bit_quant_type="nf4",
)

model = AutoModelForCausalLM.from_pretrained(
    model_id,
    quantization_config=quantization_config,
    device_map="auto",
)
tokenizer = AutoTokenizer.from_pretrained(model_id)

# パイプラインの作成
text_generator = pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
)

messages = [
    {"role": "system", "content": "You are a helpful AI assistant."},
    {"role": "user", "content": "機械学習とディープラーニングの違いを説明してください。"},
]

output = text_generator(
    messages,
    max_new_tokens=512,
    do_sample=True,
    temperature=0.7,
    top_p=0.9,
)
print(output[0]['generated_text'][-1]['content'])

3. Mistral AI

Mistral 7B

2023 年 9 月に公開された 7B モデルで、当時の同サイズモデルの中で最強の性能を記録した。

中心的な技術革新:

Sliding Window Attention (SWA): 各トークンが直前の W 個のトークンだけにアテンションする。固定サイズのキャッシュで無制限の長さを処理できる。

Rolling Buffer Cache: KV キャッシュを循環バッファとして実装し、メモリを節約する。

Pre-fill and Chunking: 長いプロンプトをチャンクに分けて処理する。

from transformers import AutoModelForCausalLM, AutoTokenizer

model_name = "mistralai/Mistral-7B-Instruct-v0.3"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype=torch.float16,
    device_map="auto"
)

# Mistral のインストラクション形式
messages = [
    {"role": "user", "content": "Python でクイックソートを実装してください。"}
]

text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)

model_inputs = tokenizer([text], return_tensors="pt").to(model.device)

generated_ids = model.generate(
    **model_inputs,
    max_new_tokens=1024,
    do_sample=True,
    temperature=0.7
)

response = tokenizer.decode(generated_ids[0][len(model_inputs.input_ids[0]):], skip_special_tokens=True)
print(response)

Mixtral 8x7B (MoE)

Mixtral は Mixture of Experts(MoE) アーキテクチャを使う。総パラメータは 46.7B だが、推論時には 12.9B のみが活性化される。

# MoE アーキテクチャの説明
moe_params = {
    "総エキスパート数": 8,
    "活性化されるエキスパート": 2,
    "総パラメータ": "46.7B",
    "活性パラメータ": "12.9B",
    "推論速度": "12.9B モデルと同等",
    "性能": "70B モデルと競合",
}

4. DeepSeek シリーズ

DeepSeek V3

2024 年 12 月に中国の DeepSeek が公開した 671B の MoE モデルである。GPT-4o や Claude 3.5 Sonnet と競合する性能をオープンソースで公開し、業界に衝撃を与えた。

Multi-Head Latent Attention (MLA): 中心的な革新で、KV キャッシュを低次元空間へ圧縮する。

# MLA の中心的なアイデア (概念的なコード)
class MultiHeadLatentAttention:
    """
    従来の MHA: K, V キャッシュがトークン数に比例して増える
    MLA: K, V を低次元の潜在ベクトルへ圧縮して保存する
    - メモリ使用量: 5~13 倍の削減
    - 性能: MHA と同等
    """
    def __init__(self, hidden_dim=7168, num_heads=128, kv_lora_rank=512):
        self.hidden_dim = hidden_dim
        self.num_heads = num_heads
        self.kv_lora_rank = kv_lora_rank  # 圧縮された KV 次元
        # 従来の KV キャッシュ: num_heads * head_dim * 2
        # MLA の KV キャッシュ: kv_lora_rank (はるかに小さい)

DeepSeek MoE の革新:

# DeepSeek V3 API の利用 (OpenAI 互換)
from openai import OpenAI

client = OpenAI(
    api_key="<DEEPSEEK_API_KEY>",
    base_url="https://api.deepseek.com"
)

response = client.chat.completions.create(
    model="deepseek-chat",
    messages=[
        {"role": "system", "content": "You are a helpful assistant"},
        {"role": "user", "content": "Python で二分探索アルゴリズムを実装してください。"}
    ],
    stream=False
)

print(response.choices[0].message.content)

DeepSeek R1

2025 年 1 月に公開された推論特化モデルである。OpenAI o1 と競合する数学/コーディング性能を示した。

主な特徴:

# DeepSeek R1 の使用例
client = OpenAI(
    api_key="<DEEPSEEK_API_KEY>",
    base_url="https://api.deepseek.com"
)

# R1 は推論モデルなので reasoning_content を含む
response = client.chat.completions.create(
    model="deepseek-reasoner",
    messages=[
        {"role": "user", "content": "1から100までの素数の和を求めてください。"}
    ]
)

# 推論過程
reasoning = response.choices[0].message.reasoning_content
# 最終回答
answer = response.choices[0].message.content

print("推論過程 (要約):", reasoning[:200], "...")
print("最終回答:", answer)

企業で活用する際の考慮事項

DeepSeek は中国企業が開発したものなので、企業で利用する際は次の点を考慮する必要がある:

  1. データ主権: API 利用時にデータが中国のサーバへ送信される
  2. オープンソースでのローカル実行: モデル重みを自社サーバへデプロイすればデータ流出はない
  3. ライセンス: 商用利用は可能だが、一部の制約を確認する必要がある
  4. 規制リスク: 特定の産業(金融、医療、防衛)では利用前に法務レビューが必要

5. Alibaba Qwen シリーズ

Qwen2 / Qwen2.5

アリババクラウドが開発したモデルシリーズである。アジア圏の言語(中国語、韓国語、日本語)で強みを見せる。

# Qwen2.5 の使用例
from transformers import AutoModelForCausalLM, AutoTokenizer

model_name = "Qwen/Qwen2.5-7B-Instruct"
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype=torch.bfloat16,
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)

messages = [
    {"role": "system", "content": "You are Qwen, a helpful assistant."},
    {"role": "user", "content": "日本語で人工知能のトレンドを説明してください。"}
]

text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)

model_inputs = tokenizer([text], return_tensors="pt").to(model.device)

generated_ids = model.generate(
    **model_inputs,
    max_new_tokens=1024,
    temperature=0.7,
    top_p=0.8,
    repetition_penalty=1.05,
)

response_ids = [
    output_ids[len(input_ids):]
    for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]

response = tokenizer.batch_decode(response_ids, skip_special_tokens=True)[0]
print(response)

Qwen2-VL (マルチモーダル)

画像、動画、文書を処理できるマルチモーダル版である。

from transformers import Qwen2VLForConditionalGeneration, AutoProcessor
from qwen_vl_utils import process_vision_info
import torch

model = Qwen2VLForConditionalGeneration.from_pretrained(
    "Qwen/Qwen2-VL-7B-Instruct",
    torch_dtype=torch.bfloat16,
    device_map="auto"
)
processor = AutoProcessor.from_pretrained("Qwen/Qwen2-VL-7B-Instruct")

# 画像の分析
messages = [
    {
        "role": "user",
        "content": [
            {"type": "image", "image": "https://example.com/chart.png"},
            {"type": "text", "text": "このチャートに見えるトレンドを日本語で説明してください。"},
        ],
    }
]

text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
image_inputs, video_inputs = process_vision_info(messages)

inputs = processor(
    text=[text],
    images=image_inputs,
    videos=video_inputs,
    return_tensors="pt",
).to(model.device)

generated_ids = model.generate(**inputs, max_new_tokens=512)
response = processor.batch_decode(
    [out_ids[len(in_ids):] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)],
    skip_special_tokens=True
)[0]
print(response)

Qwen モデルラインナップの比較

モデルパラメータ特化コンテキスト
Qwen2.5-0.5B0.5B軽量128K
Qwen2.5-7B7B汎用128K
Qwen2.5-72B72B高性能128K
Qwen2.5-Coder-7B7Bコーディング128K
Qwen2.5-Math-7B7B数学4K
Qwen2-VL-7B7Bマルチモーダル128K

6. Google Gemma

Gemma 2 のアーキテクチャ

Google DeepMind が開発した小型のオープンソースモデルである。Gemini の技術を基に作られた。

中心的な技術:

# Gemma 2 の利用
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

tokenizer = AutoTokenizer.from_pretrained("google/gemma-2-9b-it")
model = AutoModelForCausalLM.from_pretrained(
    "google/gemma-2-9b-it",
    device_map="auto",
    torch_dtype=torch.bfloat16,
)

# Gemma のチャット形式
chat = [
    {"role": "user", "content": "Python のジェネレータとイテレータの違いを説明してください。"},
]

prompt = tokenizer.apply_chat_template(chat, tokenize=False, add_generation_prompt=True)
inputs = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")

outputs = model.generate(
    inputs.to(model.device),
    max_new_tokens=1024,
    do_sample=True,
    temperature=1,
    top_k=50,
    top_p=0.95,
)

response = tokenizer.decode(outputs[0][len(inputs[0]):], skip_special_tokens=True)
print(response)

モバイル/エッジへのデプロイ

Gemma は小型モデル(2B, 9B)が優れた性能を示すため、モバイルへのデプロイに適している。

# MediaPipe を通じたオンデバイス実行 (概念)
# Google AI Edge SDK の利用

# Android/iOS で Gemma を実行
from mediapipe.tasks.python.genai import bundler, llm_inference

# モデルのバンドリング
bundler.bundle_model(
    model_path="gemma-2-2b-it-q4_k_m.gguf",
    tokenizer_path="tokenizer.model",
    start_token="<start_of_turn>",
    stop_tokens=["<end_of_turn>"],
    output_path="gemma_bundled.task",
)

7. Microsoft Phi シリーズ

Phi-3 / Phi-4

Microsoft Research が開発した小型高性能モデルのシリーズである。「教科書水準」の高品質な合成データで学習されている点が特徴だ。

from transformers import AutoModelForCausalLM, AutoTokenizer

model_name = "microsoft/Phi-4"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    device_map="auto",
    torch_dtype=torch.bfloat16,
    trust_remote_code=True
)

messages = [
    {"role": "system", "content": "You are a helpful AI assistant."},
    {"role": "user", "content": "Explain quantum computing in simple terms."}
]

pipe = pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
)

output = pipe(messages, max_new_tokens=512, return_full_text=False)
print(output[0]['generated_text'])

小型で高性能な理由: データ品質

Phi シリーズのポイントはデータ品質である。

学習データの構成 (Phi-3-mini):
- 「教科書水準」の合成データ: 約 1T トークン
- 教科書、Wikipedia、コード: 高品質なフィルタリング
- クロールデータ: 品質フィルタを通過したものだけを使用

"Less is More" の哲学:
- 3.8B パラメータで 7B モデルの性能を達成
- データ効率: 3.3T トークンで学習 (Llama 31/4)

8. オープンソース LLM 選択ガイド

タスク別の最適モデル (2025 年基準)

タスク推奨モデル理由
一般対話 (韓国語)EXAONE 3.5 7.8B韓国語特化
コード生成Qwen2.5-Coder-32Bコード性能が最高
数学/推論DeepSeek-R1 (蒸留)推論特化
マルチモーダルQwen2-VL / LLaVA画像理解
エッジ/モバイルGemma 2 2B小型で高性能
汎用高性能Llama 3.3 70Bバランスの取れた性能
コスト効率Mistral 7B高速な推論

サイズ別の推奨

3B 以下 (GPU なしで実行可能):

7B~8B (8GB VRAM):

13B~14B (16GB VRAM):

30B~34B (24GB VRAM):

70B+ (80GB VRAM またはマルチ GPU):

韓国語対応レベルの比較

モデル韓国語の理解韓国語の生成韓国文化の理解
EXAONE 3.5★★★★★★★★★★★★★★★
HyperCLOVA X★★★★★★★★★★★★★★★
Qwen2.5-72B★★★★★★★★★★★
Llama 3.3 70B★★★★★★★★
DeepSeek V3★★★★★★★★
Mistral 7B★★★★

9. Ollama でのローカル実行

Ollama のインストールと使い方

Ollama は、オープンソース LLM をローカルで簡単に実行できるツールである。

# macOS/Linux へのインストール
curl -fsSL https://ollama.com/install.sh | sh

# モデルのダウンロードと実行
ollama run llama3.2

# 他のモデルの例
ollama run mistral
ollama run qwen2.5:7b
ollama run deepseek-r1:8b
ollama run gemma2:9b

Python から Ollama を使う

import ollama

# 簡単なチャット
response = ollama.chat(model='llama3.2', messages=[
    {
        'role': 'user',
        'content': '韓国の伝統料理を5つ教えてください。',
    },
])
print(response['message']['content'])

ストリーミング応答

import ollama

def stream_response(model: str, prompt: str):
    print(f"モデル: {model}")
    print(f"プロンプト: {prompt}")
    print("応答: ", end="", flush=True)

    stream = ollama.chat(
        model=model,
        messages=[{'role': 'user', 'content': prompt}],
        stream=True,
    )

    full_response = ""
    for chunk in stream:
        text = chunk['message']['content']
        print(text, end='', flush=True)
        full_response += text

    print()
    return full_response

response = stream_response('mistral', 'Python でフィボナッチ数列を実装してください。')

FastAPI + Ollama サーバ

from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import ollama
import json

app = FastAPI()

@app.post("/chat")
async def chat(request: dict):
    model = request.get("model", "llama3.2")
    message = request.get("message", "")

    async def generate():
        stream = ollama.chat(
            model=model,
            messages=[{"role": "user", "content": message}],
            stream=True,
        )
        for chunk in stream:
            data = {
                "content": chunk["message"]["content"],
                "done": chunk.get("done", False)
            }
            yield f"data: {json.dumps(data, ensure_ascii=False)}\n\n"

    return StreamingResponse(generate(), media_type="text/event-stream")

@app.get("/models")
async def list_models():
    models = ollama.list()
    return {"models": [m["name"] for m in models["models"]]}

Ollama のモデル別の性能 vs メモリ要求量

# モデル別の要求メモリ (FP16 基準)
model_requirements = {
    "llama3.2:3b":    {"vram_gb": 2,  "speed": "非常に速い", "quality": "普通"},
    "llama3.2:8b":    {"vram_gb": 5,  "speed": "速い",       "quality": "良い"},
    "mistral:7b":     {"vram_gb": 5,  "speed": "速い",       "quality": "良い"},
    "qwen2.5:7b":     {"vram_gb": 5,  "speed": "速い",       "quality": "良い"},
    "gemma2:9b":      {"vram_gb": 6,  "speed": "普通",       "quality": "良い"},
    "llama3.3:70b":   {"vram_gb": 40, "speed": "遅い",       "quality": "非常に良い"},
    "qwen2.5:72b":    {"vram_gb": 43, "speed": "遅い",       "quality": "非常に良い"},
    "deepseek-r1:8b": {"vram_gb": 5,  "speed": "普通",       "quality": "推論特化"},
}

# 量子化バージョン (Q4 基準)
quantized_requirements = {
    "llama3.2:8b-q4":    {"vram_gb": 3,   "speed": "非常に速い"},
    "llama3.3:70b-q4":   {"vram_gb": 20,  "speed": "普通"},
    "qwen2.5:72b-q4":    {"vram_gb": 22,  "speed": "普通"},
}

10. オープンソース LLM のサービングスタック

vLLM (高性能推論サーバ)

pip install vllm
from vllm import LLM, SamplingParams

# モデルのロード
llm = LLM(
    model="meta-llama/Meta-Llama-3-8B-Instruct",
    tensor_parallel_size=2,   # GPU を 2 個使用
    gpu_memory_utilization=0.9,
    max_model_len=8192,
)

# バッチ推論
prompts = [
    "日本語 NLP の特徴を説明してください。",
    "ディープラーニングと機械学習の違いは?",
    "トランスフォーマーアーキテクチャとは?",
]

sampling_params = SamplingParams(
    temperature=0.7,
    top_p=0.9,
    max_tokens=512,
)

outputs = llm.generate(prompts, sampling_params)

for output in outputs:
    print(f"プロンプト: {output.prompt[:50]}...")
    print(f"応答: {output.outputs[0].text[:200]}")
    print()

vLLM の OpenAI 互換サーバ

# サーバの実行
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Meta-Llama-3-8B-Instruct \
    --host 0.0.0.0 \
    --port 8000 \
    --tensor-parallel-size 2
# OpenAI クライアントで vLLM サーバを使う
from openai import OpenAI

client = OpenAI(
    api_key="EMPTY",
    base_url="http://localhost:8000/v1"
)

response = client.chat.completions.create(
    model="meta-llama/Meta-Llama-3-8B-Instruct",
    messages=[{"role": "user", "content": "こんにちは!"}],
    max_tokens=256,
)
print(response.choices[0].message.content)

まとめ

オープンソース LLM のエコシステムは 2024~2026 年を通じて驚くべき速さで発展した。要点は次のとおり:

性能:

韓国語:

デプロイ:

正しいモデル選択には、タスク、韓国語対応レベル、ハードウェアの可用性、ライセンスを総合的に考慮する必要がある。韓国語サービスを開発するなら EXAONE か HyperCLOVA X を 1 番目の候補として検討し、汎用性が必要なら Llama 3.3 70B か Qwen2.5 72B を検討してほしい。

コメント

まだコメントはありません。

ログインするとコメントできます