2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【OpenAI API 禁止!?】社内データを外部に出さずに LLM を賢くする「Federated LoRA (連合学習)」の実装戦略

Last updated at Posted at 2025-11-21

本プロジェクトのコードは GitHub で公開しています (https://github.com/zhuhe98/LLM_Flower) ぜひ手元の環境で試してみてください。

なぜ今「連合学習 (Federated Learning)」なのか?

昨今、ChatGPT をはじめとする大規模言語モデル (LLM) の活用が急速に進んでいますが、企業導入においては大きな壁が存在します。それは 「データプライバシー」 の問題です。

「社内の機密データを OpenAI の API に送信するのはセキュリティポリシー上NG」
「顧客データを含むドキュメントを外部サーバーに出したくない」

このような理由から、便利な LLM の導入を断念、あるいは制限している企業は少なくありません。しかし、社内データこそが競争力の源泉であり、これを活用して LLM をカスタマイズ(Fine-tuning)したいというニーズは切実です。

そこで注目されているのが、Federated Learning (連合学習) というアプローチです。

連合学習 (Federated Learning) とは?

連合学習は、データを一箇所(サーバー)に集めるのではなく、「モデルをデータのある場所(各クライアント)へ送る」 という逆転の発想に基づいた学習手法です。

  1. サーバーから各クライアント(PC、スマホ、各支社のサーバーなど)にモデルを配布する
  2. 各クライアントは、手元の プライベートデータを使ってローカルで学習 を行う
  3. 学習によって更新された 「モデルの重み(差分)」だけ をサーバーに送り返す(生データは決して外部に出ない)
  4. サーバーは集まった重みを平均化(集約)し、より賢くなったグローバルモデルを作る

これにより、「データは社内(ローカル)に留めたまま、知識だけを共有してモデルを賢くする」 ことが可能になります。


図出所: フェデレーテッド ラーニングとは

技術的なブレイクスルー:Federated LoRA

しかし、LLM を連合学習させるには課題がありました。LLM はパラメータ数が膨大(数十億〜数千億)であり、これをネットワーク越しに何度も送受信するのは通信コスト的に非現実的だからです。

ここで登場するのが、LoRA (Low-Rank Adaptation) との組み合わせ、すなわち Federated LoRA です。

  • LoRA: モデルの全パラメータを更新するのではなく、ごく一部の「アダプタ層」だけを追加して学習する手法。パラメータ数を数千分の一に削減できます
  • Federated LoRA: 連合学習において、巨大なベースモデルそのものではなく、この 「軽量な LoRA アダプタ」だけを送受信 します

これにより、通信コストを劇的に下げつつ、LLM の連合学習が現実的なものとなりました。

実装プロジェクト:LLM_Flower

今回、この Federated LoRA の概念を実証するために、Python 製の連合学習フレームワーク Flower (flwr) を用いて実装を行いました。

プロジェクト構成

本プロジェクトでは、以下の構成でシミュレーションを行っています。

  • ベースモデル: Qwen2.5-1.5B-Instruct (軽量かつ高性能なモデル)
  • フレームワーク: Flower (連合学習), Hugging Face PEFT (LoRA), bitsandbytes (4-bit 量子化)
  • データセット: databricks-dolly-15k-ja (日本語指示データセット)

実装のポイント

1. データの Non-IID 分割 (現実的なシミュレーション)

現実世界では、各部署や各病院が持っているデータは均一ではありません(Non-IID)。
本デモではこれを再現するため、データセットをカテゴリ別に偏らせてクライアントに配布しています。

  • Client 0: 「質問応答 (QA)」に関するデータのみを持つ。
  • Client 1: 「分類」や「ブレインストーミング」など、それ以外のデータを持つ。

こうすることで、「特定のタスクに特化した知識を持つ各拠点」が協力して1つの汎用モデルを作る状況をシミュレートしています。

実際のデータ分布イメージ

具体的には、以下のように傾向の異なるデータが各クライアントに割り振られます。

Client 0: 「質問応答 (QA)」データのみ
事実に即した回答が求められるデータセットです。

[
  {
    "category": "closed_qa",
    "instruction": "ヴァージン・オーストラリアはいつから運航を開始したのですか?",
    "output": "ヴァージン・オーストラリアは2000年8月31日にヴァージン・ブルーとして運航を開始しました。"
  }
]

Client 1: 「分類・ブレインストーミング」データのみ
創造性や論理的分類が求められるデータセットです。

[
  {
    "category": "classification",
    "instruction": "ワイングラス、ランプ、電車、アイスキューブトレー、飛行機、自転車、リンゴ、スクーターのうち、移動に便利なものはどれでしょう。",
    "output": "リスト中の移動に便利なものは、電車、飛行機、自転車、スクーターです。"
  }
]

2. QLoRA による軽量化

各クライアント(エッジデバイスやローカルサーバー)のリソース制約を考慮し、4-bit 量子化 (QLoRA) を採用しています。これにより、コンシューマー向けの GPU でも学習が可能です。

# model.py の一部(イメージ)
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.float16,
)
model = AutoModelForCausalLM.from_pretrained(..., quantization_config=bnb_config)

3. Flower によるカスタムクライアントの実装

Flower の NumPyClient を継承し、Hugging Face の SFTTrainer (または通常のトレーニングループ) と連携させます。
重要なのは、get_parametersfit メソッドで、LoRA アダプタの重みのみ をやり取りするようにフィルタリングすることです。

# client.py のイメージ
class LLMClient(flwr.client.NumPyClient):
    def get_parameters(self, config):
        # LoRAのパラメータのみを抽出して返す
        return [val.cpu().numpy() for _, val in self.model.state_dict().items() if "lora" in _]

    def fit(self, parameters, config):
        # サーバーから受け取った重みをLoRA層に適用
        set_parameters(self.model, parameters)
        # ローカルデータで学習 (Fine-tuning)
        train(self.model, self.trainloader)
        # 更新された重みを返す
        return self.get_parameters(config), len(self.trainloader), {}

実行結果と定性評価

パラメータ効率と通信コスト

本実験における実際の学習パラメータ数は以下の通りです。

学習パラメータ数: 2,179,072 (約200万)
全パラメータ数:   890,795,520 (約8.9億)
学習率 (割合):    0.2446%

LoRA を適用することで、学習対象を全体の わずか約 0.24% にまで圧縮できています。 連合学習では、この「学習パラメータ(差分)」のみをネットワーク経由でサーバー・クライアント間で送受信します。数GBあるモデル全体を送るのと比較して、通信コストが劇的に削減されていることが数値からも見て取れます。

文章の評価

実際に、各クライアントでの学習を経たグローバルモデルを使って推論を行った結果の比較です。
ここでは、オーストラリアの航空会社に関する質問を投げかけました。

入力プロンプト:
質問: ヴァージン・オーストラリアはいつから運航を開始したのですか?

Before (連合学習前)
学習前のベースモデルは、質問に対して「2017年」や「明確ではありません」と回答しており、知識が曖昧で自信なさげな様子が見受けられます。

ヴァージン・オーストラリアの航空会社が運航を開始したのは、2017年です。具体的な日付については明確ではありませんが、2017年の初め頃に正式に運...

After (連合学習後)
連合学習(Federated LoRA)適用後のモデルの挙動です。

1973年1月28日、ヴァージン・オーストラリア航空がオーストラリアの首都カールドルフで開業しました。この日は、オーストラリアの航空業界に新しい

考察

学習前と比較して、「具体的な日付」や「場所」 を明言するスタイル へと変化していることが確認できます。 これは、モデルがローカルクライアント(今回の例ではQAデータを持つClient)のデータ分布や回答スタイル(Instruction Tuningの形式)に影響を受け、重みが確実に更新されたことを示唆しています。

※なお、今回の短い学習ステップ数ではまだ事実(Fact)の正確性までは完全に収束していない可能性がありますが(※史実では2000/08/31年設立)、「プライベートデータを用いて、モデルの出力挙動を変化させることに成功した」 という点で、連合学習の効果を確認できました。

まとめ

Federated LoRA は、「データプライバシー」と「LLM の活用」という相反する課題を解決する強力なソリューションです。
社外に出せないデータを各拠点で安全に学習させ、その「知恵」だけを集約することで、組織全体で使える賢い LLM を育てることができます。


キーワード: #LLM #FederatedLearning #LoRA #Flower #Qwen #OpenAI #Privacy #Python

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?