|
--- |
|
base_model: |
|
- NTQAI/chatntq-ja-7b-v1.0 |
|
- Elizezen/Antler-7B |
|
language: |
|
- ja |
|
tags: |
|
- mistral |
|
- mixtral |
|
- merge |
|
- moe |
|
- not-for-all-audiences |
|
- nsfw |
|
pipeline_tag: text-generation |
|
--- |
|
|
|
# LightChatAssistant-2x7B |
|
|
|
#### GGUF量子化は[こちら](https://huggingface.co/Sdff-Ltba/LightChatAssistant-2x7B-GGUF) |
|
|
|
#### より日本語を自然にする調整を手作業で施した[LightChatAssistant-TypeB-2x7Bを製作しました。](https://huggingface.co/Sdff-Ltba/LightChatAssistant-TypeB-2x7B) |
|
|
|
#### 使用モデルを4つに増やした4x7B版を[Aratakoさん](https://huggingface.co/Aratako)が開発してくださいました。[こちら](https://huggingface.co/Aratako/LightChatAssistant-4x7B)からご覧ください。 |
|
|
|
日本語が滑らかで、高速なチャット・ノベル生成モデルを目指して作成しました。 |
|
32kのContextSize対応、iQ3_XXS量子化でVRAM12GBでフルロード可能なモデルです。 |
|
|
|
## モデル概要 |
|
|
|
パラメータ数が小さくても優秀なベンチマークスコアを持つ、Mistral7Bモデルをベースとした日本語対応モデルを使用しました。 |
|
2つのモデルそれぞれにChatVector手法を用いて対話能力強化ののち、mergekitでMoE化しました。 |
|
|
|
## MoE化モデルの前準備(ChatVector適用) |
|
|
|
以下の2モデルをChatVector手法で対話強化して素材に使用しています。 |
|
|
|
- [NTQAI/chatntq-ja-7b-v1.0](https://huggingface.co/NTQAI/chatntq-ja-7b-v1.0) |
|
- [Elizezen/Antler-7B](https://huggingface.co/Elizezen/Antler-7B) |
|
|
|
1. ChatVectorは以下を用いて適用します。`chat_vector`を0.8倍にするのは[aixsatoshi/Swallow-MX-8x7b-NVE-chatvector-Mixtral-instruct-v2](https://huggingface.co/aixsatoshi/Swallow-MX-8x7b-NVE-chatvector-Mixtral-instruct-v2)を参考にしました。 |
|
```python |
|
# Antler-7Bに適用した例 chat_vectorの重みを0.8倍にして日本語モデルに足す |
|
|
|
from transformers import AutoModelForCausalLM |
|
import torch |
|
|
|
base_model = AutoModelForCausalLM.from_pretrained( |
|
"mistralai/Mistral-7B-v0.1", |
|
torch_dtype=torch.bfloat16, |
|
device_map="cpu", |
|
) |
|
inst_model = AutoModelForCausalLM.from_pretrained( |
|
"mistralai/Mistral-7B-Instruct-v0.2", |
|
torch_dtype=torch.bfloat16, |
|
device_map="cpu", |
|
) |
|
cp_model = AutoModelForCausalLM.from_pretrained( |
|
"Elizezen/Antler-7B", |
|
torch_dtype=torch.bfloat16, |
|
device_map="cpu", |
|
) |
|
|
|
for k, v in cp_model.state_dict().items(): |
|
chat_vector = inst_model.state_dict()[k] - base_model.state_dict()[k] |
|
new_v = v + ( 0.8 * chat_vector.to(v.device) ) |
|
v.copy_(new_v) |
|
|
|
cp_model.save_pretrained("./model-chatvector") |
|
``` |
|
|
|
2. 作成されたモデルディレクトリにはtokenizer関係のファイルがないので、ChatVectorを適用する日本語モデルから(上の例だとElizezen/Antler-7B)足りないファイルをコピーします。[special_tokens_map.json、tokenizer.json、tokenizer.model、tokenizer_config.json] |
|
|
|
3. 作成されたモデルディレクトリにあるconfig.jsonを以下のように変更して、ContextSizeの内容をMistral7B-Instructの通りに修正します。(一つ目以外はあまり理解していない) |
|
|
|
- `"max_position_embeddings"`を`32768` |
|
- `"rope_theta"`を`1000000.0` |
|
- `"sliding_window"`を`null` |
|
|
|
## MoE化 |
|
|
|
[mergekit](https://github.com/arcee-ai/mergekit)を用いて素材2モデルをMoE化しています。 |
|
|
|
config.ymlは以下を使用しました。[Undi95/Mixtral-8x7B-MoE-RP-Story](https://huggingface.co/Undi95/Mixtral-8x7B-MoE-RP-Story)を参考にしました。 |
|
```config.yml |
|
base_model: ./chatntq-ja-7b-v1.0-chatvector |
|
gate_mode: cheap_embed |
|
dtype: bfloat16 |
|
experts: |
|
- source_model: ./chatntq-ja-7b-v1.0-chatvector |
|
positive_prompts: |
|
- "sex" |
|
- "roleplay" |
|
- "erotic" |
|
- "fuck" |
|
- "orgasm" |
|
- "uncensored" |
|
- "question" |
|
- "answer" |
|
- "chat" |
|
- "companion" |
|
- "[Mode: Roleplay]" |
|
- "[Mode: Chat]" |
|
negative_prompts: |
|
- "storywriting" |
|
- "book" |
|
- "story" |
|
- "chapter" |
|
- "tale" |
|
- "history" |
|
- "write" |
|
- "[Mode: Writing]" |
|
- source_model: ./Antler-7B-chatvector |
|
positive_prompts: |
|
- "sex" |
|
- "storywriting" |
|
- "erotic" |
|
- "fuck" |
|
- "orgasm" |
|
- "uncensored" |
|
- "book" |
|
- "story" |
|
- "chapter" |
|
- "tale" |
|
- "history" |
|
- "write" |
|
- "[Mode: Writing]" |
|
tokenizer_source: union |
|
``` |
|
|
|
## 環境 |
|
|
|
- CPU: Ryzen 5 5600X |
|
- GPU: GeForce RTX 3060 12GB |
|
- RAM: DDR4-3200 96GB |
|
- OS: Windows 10 |
|
- software: Python 3.12.2、[KoboldCpp](https://github.com/LostRuins/koboldcpp) v1.61.2 |
|
|
|
#### KoboldCppの設定 |
|
|
|
(デフォルトから変更したもののみ記載) |
|
- `GPU Layers: 33` (33以上でフルロード) |
|
- `Context Size: 32768` |
|
|
|
## 出力例 |
|
|
|
```出力例 |
|
User: 次のお話の続きを考えて恋愛小説で書いてください。 |
|
吾輩は猫である。名前はまだない |
|
|
|
|
|
了解しました、吾輩が主人公となりますね。タイトルは「A Cat's Love Story」としましょうか。この物語は、吾輩が飼われている家で出会った人間の女性に恋をする話です。 |
|
|
|
吾輩は、ある日突然現れた野良猫でした。彼女、美香さんの家庭にやって来た時、凄く警戒されましたが、その中でも特に美香さんは優しい人でした。毎日彼女が作ってくれるご飯は美味しく、彼女が触ってくれる手は温かく、吾輩は彼女にすぐに心を開きました。 |
|
|
|
ある日、吾輩は美香さんが自分を抱きかかえて、庭を見渡せる場所に連れて行ってくれました。そこで、吾輩は初めて空を飛ぶ鳥たちを見ました。青い空に白い雲が浮かび、風が匂い立つ草原を吹き抜けていく様子を、彼女と一緒に眺めていました。その時、吾輩は美香さんがとても愛おしくなりました。 |
|
|
|
しかし、吾輩は猫であり、言葉を話せず、感情を表現する方法もありません。それでも、吾輩は美香さんを追いかけ続けました。美香さんは他の男性と付き合っていましたが、吾輩はじっと我慢し、ただ待ち続けました。 |
|
|
|
美香さんは気づいていませんでしたが、吾輩は彼女の部屋に入り込み、寝室に入り込むようになりました。彼女が疲れ果てて眠る横で、吾輩は静かに身体を寄 |
|
``` |
|
|
|
### 参考文献 |
|
|
|
- [Chat Vectorを使って日本語LLMをチャットモデルに改造する #Python - Qiita](https://qiita.com/jovyan/items/ee6affa5ee5bdaada6b4) |
|
- [学習済みの LLM を束ねて Mixture of Experts を作るテク](https://zenn.dev/zaburo_ch/articles/88e35e5c80f974) |
|
|