Instructions to use hmwri/mlab-LLM-MoE-900M with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use hmwri/mlab-LLM-MoE-900M with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="hmwri/mlab-LLM-MoE-900M") messages = [ {"role": "user", "content": "Who are you?"}, ] pipe(messages)# pip install -U transformers accelerate # Load model directly from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("hmwri/mlab-LLM-MoE-900M") model = AutoModelForCausalLM.from_pretrained("hmwri/mlab-LLM-MoE-900M", device_map="auto") messages = [ {"role": "user", "content": "Who are you?"}, ] inputs = tokenizer.apply_chat_template( messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt", ).to(model.device) outputs = model.generate(**inputs, max_new_tokens=256) print(tokenizer.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use hmwri/mlab-LLM-MoE-900M with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "hmwri/mlab-LLM-MoE-900M" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "hmwri/mlab-LLM-MoE-900M", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/hmwri/mlab-LLM-MoE-900M
- SGLang
How to use hmwri/mlab-LLM-MoE-900M with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "hmwri/mlab-LLM-MoE-900M" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "hmwri/mlab-LLM-MoE-900M", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "hmwri/mlab-LLM-MoE-900M" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "hmwri/mlab-LLM-MoE-900M", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }' - Docker Model Runner
How to use hmwri/mlab-LLM-MoE-900M with Docker Model Runner:
docker model run hf.co/hmwri/mlab-LLM-MoE-900M
mlab-LLM MoE 900M
日本語QAを対象にした、実験用の小規模MoEモデルです。 Dense 300Mモデルを4 experts / top-2のMoEに変換し、層ごとのload-balancing lossを使用して 全パラメータを3 epoch更新しました。Baseモデルではなく、チャット形式のSFTモデルです。 研究室の公式見解・最新情報を保証する案内システムではありません。
Model Overview
| 項目 | 内容 |
|---|---|
| 公開者 | hmwri |
| モデル種別 | 日本語・自己回帰言語モデル、sparse MoE、SFT済み |
| 総パラメータ / active概算 | 906M / 502M(共有部分を含む、token単位) |
| Experts | 各層4個、tokenごとに2個選択 |
| 学習の出発点 | 独自Dense 299MのInstruction・対象領域SFT後の重み |
| 最終更新対象 | 全パラメータ。LoRAではない |
| 精度 / 配布形式 | BF16 / Transformers標準Mixtral、独自コード不要 |
| コンテキスト | 設定4,096 tokens、最終SFTは2,048 tokens |
| 入力形式 | 付属chat templateとsystem文を使用 |
| ライセンス | 未指定。下記License参照 |
Architecture · Training · Evaluation · Quickstart · Limitations · License
モデルの位置づけと各段階の目的
ここでいう Base / Instructionは学習段階、Dense / MoEはネットワーク構造を表します。 DenseだからBase、MoEだからInstructionという対応ではありません。 このリポジトリで配布するのは、以下の最終段階のMoE SFTモデルです。
SFT前の通常形式の重みはmlab-LLM 300M Base、 ブラウザ向けの量子化版はBase ONNXで配布しています。
| 段階 | 構造 | 学習の目的 | 入出力・用途 |
|---|---|---|---|
| Base事前学習 | Dense 299M | 日本語コーパスの次token予測から、言語のパターンと基礎的な表現を学ぶ | 文章の続きを生成する。チャット用の指示追従はこの段階の学習目的ではない |
| 一般Instruction SFT | 同じDense 299M | 質問・指示に対する応答形式を学ぶ | chat templateに従う対話。構造を変えずに重みを更新 |
| 対象領域SFT・基本事項の集中学習 | 同じDense 299M | 対象領域のQAに適応し、30の基本事項への応答を重点的に学ぶ | MoE初期化の出発点。基本事項は一般常識ではなく対象領域固有の知識 |
| MoE化と追加SFT(公開モデル) | MoE 906M、top-2 | FFN容量を拡張し、幅広いQAへの適応と基本事項の保持の両立を検証する | 全重みを追加学習した日本語チャットモデル |
Dense段階は、小規模な単一ネットワークで言語学習から対象領域への適応まで行うための土台です。 MoE段階は、その学習済み表現を引き継ぎながらFFNの選択肢を増やす実験です。 検索機能の追加、専門分野ごとの手動モデル切り替え、4個の独立モデルの多数決ではありません。 今回のtop-2構成は元のDenseの1個のFFNに対して2個のFFNを実行するため、 元のDense 299Mより計算を軽くすることが目的ではありません。 4個すべてのexpertを毎token実行する構成に対し、実行対象を2個に制限します。
Architecture
Base / Denseの構造
Baseは、既存のLlama配布重みを使ったモデルではなく、Llama互換のdecoder-only Transformerを ランダム初期化して事前学習したものです。一般Instruction SFTと対象領域SFTでも、 MoE化するまではこのDense構造を維持しています。
| 項目 | Base / Dense | 公開MoE |
|---|---|---|
| Transformersクラス | LlamaForCausalLM |
MixtralForCausalLM |
| 総パラメータ数 | 299,157,376 | 906,186,624 |
| decoder層数 / hidden幅 | 28 / 896 | 同じ |
| attention | causal GQA、query 14 heads / KV 7 heads、head幅64 | 同じ、expert間で共有 |
| FFN | 各層1個のSwiGLU、intermediate幅2,688 | 同じ幅のSwiGLUを各層4個、tokenごとに2個選択 |
| 正規化 | pre-RMSNorm、epsilon 1e-5 |
同じ |
| 位置表現 | RoPE、theta 10000、scalingなし |
同じ |
| 語彙 / 埋め込み | 32,768、入力embeddingと出力LM headを共有 | 同じ |
| 設定上の最大系列長 | 4,096 tokens | 4,096 tokens |
| routing | なし | 各層の学習可能なrouter、4 experts / top-2 |
各Dense層の処理は次の順序です。attentionとFFNのそれぞれに残差接続があります。
token IDs -> embedding (896)
-> 28 x [RMSNorm -> causal GQA -> residual add
RMSNorm -> SwiGLU FFN -> residual add]
-> final RMSNorm -> shared LM head -> next-token logits (32,768)
SwiGLU FFNは、入力を2本の射影で896から2,688次元へ写し、 一方にSiLUを適用して要素ごとに掛け、896次元へ戻します。 MoEではこのFFN部分だけがrouter付きのexpert群へ置き換わり、層数やattention幅は増えません。
Tokenizerは日本語コーパスから作成したSentencePiece Unigram(32,768語彙)で、
nmt_nfkc正規化とbyte fallbackを使用しています。公開リポジトリにはTransformersで
読み込める形式とchat templateを同梱しています。LlamaやQwenのtokenizerを流用したものではありません。
設定上の4,096 tokensは長文性能の保証ではなく、最終SFTは2,048 tokensで行っています。
MoEの構造と学習方法
- Native Transformers
MixtralForCausalLM; custom code / trust_remote_code不要 - Total parameters: 906,186,624 (約906M。900Mは丸めたモデル名)
- 28 layers, hidden size 896, intermediate size 2,688
- 4 FFN experts per layer, top-2 token routing
- 14 attention heads / 7 KV heads; shared attention
- 32,768 vocabulary; tied embeddings; context configuration 4,096 tokens
- SFT sequence length: 2,048 tokens; BF16 weights
- この最終学習ではattention・埋め込み・正規化も更新しています。
DenseからMoEへの変換
元のDenseモデルの各層にあるFFN(トークンの特徴を変換するフィードフォワード部分)を、 同じ重みを持つ4個のexpertに複製しました。attention・埋め込み・正規化などの共有部分は 元の重みを引き継ぎ、各層のrouterだけをランダム初期化しています。 異なる4つの事前学習モデルを合体させた構成ではなく、1つのDenseモデルからのupcyclingです。
routerは各tokenの隠れ状態からexpertのスコアを計算し、上位2個の出力を重み付きで合成します。 選択は層ごと・tokenごとに行われます。「論文担当」「ニュース担当」などの役割を 人手で割り当てたり、質問全体に対して1個のexpertを選んだりする構成ではありません。 expertの意味的な専門分化が成立したかは、独立に検証していません。
総重みは約906Mですが、1 tokenで使う重みの概算は共有部分を含め約502Mです。 これは速度やGPUメモリが同規模Denseと等しくなるという意味ではありません。 読み込みには全expertの重みが必要で、routingにも処理コストがあります。
Load-balancing lossと更新対象
一部expertに選択が集中するのを抑えるため、各層で選択頻度とrouter確率に基づく load-balancing lossを計算し、28層の平均に0.01を掛けて言語モデルの損失へ加えています。 paddingは集計から除外します。全層をまとめて集計する方式と異なり、ある層の偏りが 別の層の逆方向の偏りで見かけ上相殺されるのを避ける目的です。 均等なexpert利用そのものが、正確な回答や知識の獲得を保証するわけではありません。
初期の比較実験では共有層を固定しましたが、公開モデルは固定せず、全906Mパラメータを更新しています。 共有層固定版の学習済み重みから継続したのではなく、同じ初期MoE重みから学習し直したものです。
Training
- 299,157,376-parameter Denseモデルをscratchから事前学習。
hotchpotch/fineweb-2-edu-japaneseのsample_10BTを使用し、約10.642B tokensで学習。 - 一般Instruction SFT:
llm-jp/magpie-sft-v1.0とkunishou/oasst1-chat-44k-ja。準備済みtrainは計23,809例。 - 研究室の公開ページ・ニュース・論文由来の合成QAでSFTし、研究室の30の基本事項を 集中学習したDense checkpointからMoEを初期化。 基本事項QAは一般常識QAではなく、研究室固有の知識です。
- DenseのFFNを4個に複製し、routerを初期化。研究室QA12,243例と基本事項の replay3,061例、計15,304例でMoEを全層更新。 研究室QAには資料なし・資料付き、資料横断・個別論文などを含みます。 合成QAはローカルのQwen teacherを用いた生成パイプラインで作成しました。
本リポジトリには元の論文PDF・抽出本文・学習会話データを含めていません。 学習例数には同一会話からの派生例やreplayを含み、独立した論文数や会話数ではありません。
合成QAの生成方法
公開ページ・ニュース・論文PDF由来のテキストを、出典ID付きの断片(chunk)に整理しました。
生成runの記録では資料572件を扱っています。これはすべてが論文という意味ではありません。
teacherはLM StudioのOpenAI互換APIで呼び出したQwenで、ローカルのモデル識別子は
qwen/qwen3.8-27bでした。この識別子は実行ログ上の値であり、配布元の重みrevisionや
量子化方式まで本モデルカードで特定・保証するものではありません。
同じteacherを、別々のプロンプトによる「質問設計役」と「回答作成役」に分けて呼び出しました。 別々の重みを持つ2モデルを訓練した、という意味ではありません。
| 質問の系統 | 質問役が参照する情報 | 採用された会話数 |
|---|---|---|
| blind | 資料一覧を与えず、研究室への一般的な質問を設計 | 998 |
| catalog | 公開資料一覧を見て、関連研究の探索や資料横断の質問を設計 | 1,793 |
| paper | 個別論文の資料を見て、その内容を掘り下げる質問を設計 | 3,933 |
| 合計 | 当初の7,000会話目標に対して採用済みの範囲を使用 | 6,724 |
質問役には、学部生・研究者・企業担当者・一般来訪者などのペルソナと、口語・丁寧語・ 比較・具体例の要求などの言い方をプログラム側から割り当てました。複数turnの会話では 関連研究を尋ねてから詳細を掘り下げる流れも作り、途中で質問者の設定を変更する仕組みも使いました。 最終runの交代確率設定は0.7です。既生成の質問も文字数上限付きで提示し、重複を減らしました。 ただし、意味的な重複を完全に除去した保証はありません。
回答役には、質問に応じて選択した資料chunkを渡し、提示資料だけに基づく短い日本語回答、 資料で確認できない場合の回答拒否、Web検索・外部URL参照の禁止を指示しました。 回答役が資料全文を常に読んでいる構成ではなく、chunk選択や文字数上限による情報欠落があり得ます。
構造化出力と学習用テキストの分離
teacherの出力にはJSON Schemaを使い、回答文、回答可能性のフラグ、引用chunk ID、 根拠の原文引用を別フィールドに保存しました。構造・ID・turn数などを検査し、不正な出力は 修正指示を添えて再試行しました。引用照合の情報も保存しましたが、人手で全会話の 事実性・引用の妥当性を確認したデータセットではありません。 teacherの推論過程や根拠管理用のJSONを、そのままassistantの回答として学習させてはいません。
学習用には、質問・回答だけを含む資料なしのclosed_book形式と、
引用根拠のテキストをuser側へ添えたgrounded形式へ展開しました。
資料付き形式の根拠はteacherの引用から構成したもので、実運用の検索精度を測る評価ではありません。
assistantの回答tokenだけを学習lossの対象とし、根拠ID・引用などは別途provenanceとして保持しています。
最終MoE学習では研究室例12,243件(catalog 3,391/paper 7,434/blind 1,418)に、 集中学習した30の基本事項のtrain例を再利用するreplayを3,061件混ぜ、約80:20としました。 この最終段階のreplayは一般Instructionデータではありません。 同じ会話threadがtrainとvalidationに跨がない分割を引き継ぎ、長すぎる例を除外していますが、 同じ論文・同じ事実まで完全に分離する評価設計ではありません。
Final Run
- Seed: 20260930; 2,870 optimizer steps (約3 epochs)
- Microbatch 2, gradient accumulation 8, effective batch 16
- LR: 1e-5 for non-router parameters, 1e-4 for routers
- Warmup 30 steps, then constant LR
- Auxiliary loss: 0.01 * mean(per-layer load-balancing losses), excluding padding
- Final checkpoint: 2870; training completed 2026-10-02 (JST)
Evaluation
固定の研究室validation128例、および基本事項validation120例でのassistant-token loss: 同じtokenizer・system文を使い、promptとpaddingを除外した教師ありラベル数で 各batchのcross-entropyを重み付けして集計しています。低いほど良い指標です。
| Model | Lab validation | Core QA validation |
|---|---|---|
| Initial MoE | 3.535121 | 0.067417 |
| Shared layers frozen, layerwise loss, 3 epochs | 2.381652 | 0.245047 |
| This model: full update, layerwise loss, 3 epochs | 2.358875 | 0.242095 |
load-balancing lossは検証値に含みません。基本事項validationは既知の事実への異なる質問表現であり、 未知の知識への汎化指標ではありません。loss改善は回答の正確性改善を保証しません。
研究室QAのvalidation候補は667例で、表はそのうち学習中の固定128例を使った指標です。 基本事項側は初期値よりlossが悪化しており、追加適応と保持の間にトレードオフがあります。 共有層固定版と全層更新版は同じ初期MoEから開始していますが、この表だけでは Denseに対するMoEの優位性を切り分けられません。構造の効果を主張するには、 同じ初期Dense・同じデータ・比較可能な学習予算での対照実験が必要です。 一般的な日本語ベンチマーク、事実正答率、回答拒否精度、推論速度の比較結果は本カードでは報告していません。
Intended Use
- 小規模DenseからMoEへのupcyclingと、対象領域への追加SFTの挙動を調べる研究・試作。
- 学習済みの対象領域について、回答を原資料と照合しながら行う対話実験。
- 参考資料を入力に添えた応答の検証。ただし検索器や引用検証器は内蔵していません。
汎用チャットモデルとしての性能や、自動で正しい情報を提供する業務用途は検証していません。 根拠の確認なしに回答を公開したり、重要な判断に利用したりする用途には適しません。
Quickstart
検証環境: Python / PyTorch 2.12.1 / Transformers 5.15.0。 古いTransformersや別の推論エンジンとの互換性は未検証です。 対応するPyTorchをインストールした環境で、次の依存関係を使用します。
pip install "transformers==5.15.0" huggingface_hub safetensors
import torch
from huggingface_hub import hf_hub_download
from transformers import AutoModelForCausalLM, AutoTokenizer
repo = "hmwri/mlab-LLM-MoE-900M"
revision = "790f35ed98577e67b3937b7a0e6c524fd86221be" # published weight revision
tokenizer = AutoTokenizer.from_pretrained(repo, revision=revision)
model = AutoModelForCausalLM.from_pretrained(
repo, revision=revision, dtype=torch.bfloat16, attn_implementation="sdpa"
).to("cuda").eval()
with open(hf_hub_download(repo, "system_prompt.txt", revision=revision), encoding="utf-8") as f:
system = f.read().strip()
messages = [
{"role": "system", "content": system},
{"role": "user", "content": "この研究室はどのような研究をしていますか?"},
]
inputs = tokenizer.apply_chat_template(
messages, tokenize=True, add_generation_prompt=True,
return_dict=True, return_tensors="pt",
).to(model.device)
with torch.inference_mode():
result = model.generate(**inputs, max_new_tokens=128, do_sample=False, use_cache=True)
print(tokenizer.decode(result[0, inputs["input_ids"].shape[1]:], skip_special_tokens=True))
必要なら質問に参考資料を添えてください。モデル自身に検索機能はありません。
この例はCUDAとBF16に対応したGPUを前提とします。BF16重みだけで約1.81 GBあり、
実行時にはKV cache・中間テンソル・ランタイム用の追加メモリが必要です。
入力と出力の合計をまず2,048 tokens以内に収めて使用してください。
system_prompt.txtは対象領域を指定する学習時のsystem文で、任意の汎用system文に
置き換えた場合の挙動は検証していません。上記は利用コードであり、回答品質の実証例ではありません。
Release and Reproducibility
配布物と再現性
配布物はBF16のmodel.safetensors、モデル設定、生成設定、tokenizer、chat template、
system_prompt.txtです。LoRA adapterではなく、単体で読み込める全モデルの重みです。
optimizer状態・元資料・合成学習会話は同梱していません。
推論は上記revisionに固定できますが、この配布物だけで学習全体を完全再現できるわけではありません。
teacherの正確な配布元revision・量子化方式や未配布データなど、再現性に残る制約があります。
Generation Review
公開した最終重みから2026-10-02にローカルで6候補の回答を生成し、内容を確認しました。
付属system_prompt.txt、BF16、SDPA、greedy (do_sample=False)、最大128 tokens、
repetition_penalty=1.0で、各質問を独立した新規会話として実行しました。
研究室概要の1例は根拠資料と整合しましたが、他の候補には未確認の数値・日時の生成や
反復が見られました。少数の手動確認であり、モデル全体の正答率を示す評価ではありません。
研究室概要は集中学習した内容であり、未知の知識への性能実証ではありません。
対象の固有名を説明に掲載しない方針のため、質問・回答の原文は掲載していません。
Limitations
- 反復、不自然な日本語、資料にない数値・名称・日時の生成が起こり得ます。
- 未確認情報への適切な回答拒否、算数、一般的な指示追従を保証しません。
- 小規模な研究実験用です。重要な判断には原資料の確認が必要です。
- 教師モデルの誤りや学習データの偏りを引き継ぐ可能性があります。安全性・暗記・個人情報漏えいを体系的に評価したモデルではありません。
License
- モデル重みの利用ライセンスは現時点で未指定です。公開ダウンロード可能であることは、 無制限の再利用・商用利用の許諾を意味しません。
- 学習に使った外部データ・論文にはそれぞれの権利・利用条件があります。 包括的な権利確認を済ませた、という主張はしていません。
公開用にはoptimizer状態を除外し、generation_configのuse_cacheをtrueに変更しています。 学習済みモデル重みは最終checkpointのままです。
Contact
動作不良の報告はCommunityへお願いします。 revision、ライブラリのバージョン、生成設定を添え、機密情報や個人情報は投稿しないでください。
- Downloads last month
- 921