Upload README.md
Browse files
README.md
ADDED
@@ -0,0 +1,140 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
---
|
2 |
+
language:
|
3 |
+
- ja
|
4 |
+
tags:
|
5 |
+
- mistral
|
6 |
+
- mixtral
|
7 |
+
- not-for-all-audiences
|
8 |
+
- nsfw
|
9 |
+
pipeline_tag: text-generation
|
10 |
+
---
|
11 |
+
|
12 |
+
# chatntq-chatvector_MoE_Antler-chatvector_2x7B
|
13 |
+
|
14 |
+
日本語が滑らかで、高速なチャット・ノベル生成モデルを目指して作成しました。
|
15 |
+
32kのContextSize対応、iq3_xxs量子化でVRAM12GBでフルロード可能なモデルです。
|
16 |
+
|
17 |
+
## モデル概要
|
18 |
+
|
19 |
+
パラメータ数が小さくても優秀なベンチマークスコアを持つ、Mistral7Bモデルをベースとした日本語対応モデルを使用しました。
|
20 |
+
2つのモデルそれぞれにChatVector手法を用いて対話能力強化ののち、mergekitでMoE化しました。
|
21 |
+
|
22 |
+
## MoE化モデルの前準備(ChatVector適用)
|
23 |
+
|
24 |
+
以下の2モデルをChatVector手法で対話強化して素材に使用しています。
|
25 |
+
|
26 |
+
- [NTQAI/chatntq-ja-7b-v1.0](https://huggingface.co/NTQAI/chatntq-ja-7b-v1.0)
|
27 |
+
- [Elizezen/Antler-7B](https://huggingface.co/Elizezen/Antler-7B)
|
28 |
+
|
29 |
+
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)を参考にしました。
|
30 |
+
```python
|
31 |
+
# Antler-7Bに適用した例 chat_vectorの重みを0.8倍にして日本語モデルに足す
|
32 |
+
|
33 |
+
from transformers import AutoModelForCausalLM
|
34 |
+
import torch
|
35 |
+
|
36 |
+
base_model = AutoModelForCausalLM.from_pretrained(
|
37 |
+
"mistralai/Mistral-7B-v0.1",
|
38 |
+
torch_dtype=torch.bfloat16,
|
39 |
+
device_map="cpu",
|
40 |
+
)
|
41 |
+
inst_model = AutoModelForCausalLM.from_pretrained(
|
42 |
+
"mistralai/Mistral-7B-Instruct-v0.2",
|
43 |
+
torch_dtype=torch.bfloat16,
|
44 |
+
device_map="cpu",
|
45 |
+
)
|
46 |
+
cp_model = AutoModelForCausalLM.from_pretrained(
|
47 |
+
"Elizezen/Antler-7B",
|
48 |
+
torch_dtype=torch.bfloat16,
|
49 |
+
device_map="cpu",
|
50 |
+
)
|
51 |
+
|
52 |
+
for k, v in cp_model.state_dict().items():
|
53 |
+
chat_vector = inst_model.state_dict()[k] - base_model.state_dict()[k]
|
54 |
+
new_v = v + ( 0.8 * chat_vector.to(v.device) )
|
55 |
+
v.copy_(new_v)
|
56 |
+
|
57 |
+
cp_model.save_pretrained("./model-chatvector")
|
58 |
+
```
|
59 |
+
|
60 |
+
2. 作成されたモデルディレクトリにはtokenizer関係のファイルがないので、ChatVectorを適用する日本語モデルから(上の例だとElizezen/Antler-7B)足りないファイルをコピーします。[special_tokens_map.json、tokenizer.model、tokenizer_config.json]
|
61 |
+
|
62 |
+
3. 作成されたモデルディレクトリにあるconfig.jsonを以下のように変更して、ContextSizeの内容をMistral7BInstructの通りに修正します。(一つ目以外はあまり理解していない)
|
63 |
+
|
64 |
+
- "max_position_embeddings"を32768
|
65 |
+
- "rope_theta"を1000000.0
|
66 |
+
- "sliding_window"をnull
|
67 |
+
|
68 |
+
## MoE化
|
69 |
+
|
70 |
+
[mergekit](https://github.com/arcee-ai/mergekit)を用いて素材2モデルをMoE化しています。
|
71 |
+
|
72 |
+
config.ymlは以下を使用しました。[Undi95/Mixtral-8x7B-MoE-RP-Story](https://huggingface.co/Undi95/Mixtral-8x7B-MoE-RP-Story)を参考にしました。
|
73 |
+
```config.yml
|
74 |
+
base_model: ./chatntq-ja-7b-v1.0-chatvector
|
75 |
+
gate_mode: cheap_embed
|
76 |
+
dtype: bfloat16
|
77 |
+
experts:
|
78 |
+
- source_model: ./chatntq-ja-7b-v1.0-chatvector
|
79 |
+
positive_prompts:
|
80 |
+
- "sex"
|
81 |
+
- "roleplay"
|
82 |
+
- "erotic"
|
83 |
+
- "fuck"
|
84 |
+
- "orgasm"
|
85 |
+
- "uncensored"
|
86 |
+
- "question"
|
87 |
+
- "answer"
|
88 |
+
- "chat"
|
89 |
+
- "companion"
|
90 |
+
- "[Mode: Roleplay]"
|
91 |
+
- "[Mode: Chat]"
|
92 |
+
negative_prompts:
|
93 |
+
- "storywriting"
|
94 |
+
- "book"
|
95 |
+
- "story"
|
96 |
+
- "chapter"
|
97 |
+
- "tale"
|
98 |
+
- "history"
|
99 |
+
- "write"
|
100 |
+
- "[Mode: Writing]"
|
101 |
+
- source_model: ./Antler-7B-chatvector
|
102 |
+
positive_prompts:
|
103 |
+
- "sex"
|
104 |
+
- "storywriting"
|
105 |
+
- "erotic"
|
106 |
+
- "fuck"
|
107 |
+
- "orgasm"
|
108 |
+
- "uncensored"
|
109 |
+
- "book"
|
110 |
+
- "story"
|
111 |
+
- "chapter"
|
112 |
+
- "tale"
|
113 |
+
- "history"
|
114 |
+
- "write"
|
115 |
+
- "[Mode: Writing]"
|
116 |
+
tokenizer_source: union
|
117 |
+
```
|
118 |
+
|
119 |
+
## 出力例
|
120 |
+
|
121 |
+
```出力例
|
122 |
+
User: 次のお話の続きを考えて恋愛小説で書いてください。
|
123 |
+
吾輩は猫である。名前はまだない
|
124 |
+
|
125 |
+
|
126 |
+
了解しました、吾輩が主人公となりますね。タイトルは「A Cat's Love Story」としましょうか。この物語は、吾輩が飼われている家で出会った人間の女性に恋をする話です。
|
127 |
+
|
128 |
+
吾輩は、ある日突然現れた野良猫でした。彼女、美香さんの家庭にやって来た時、凄く警戒されましたが、その中でも特に美香さんは優しい人でした。毎日彼女が作ってくれるご飯は美味しく、彼女が触ってくれる手は温かく、吾輩は彼女にすぐに心を開きました。
|
129 |
+
|
130 |
+
ある日、吾輩は美香さんが自分を抱きかかえて、庭を見渡せる場所に連れて行ってくれました。そこで、吾輩は初めて空を飛ぶ鳥たちを見ました。青い空に白い雲が浮かび、風が匂い立つ草原を吹き抜けていく様子を、彼女と一緒に眺めていました。その時、吾輩は美香さんがとても愛おしくなりました。
|
131 |
+
|
132 |
+
しかし、吾輩は��であり、言葉を話せず、感情を表現する方法もありません。それでも、吾輩は美香さんを追いかけ続けました。美香さんは他の男性と付き合っていましたが、吾輩はじっと我慢し、ただ待ち続けました。
|
133 |
+
|
134 |
+
美香さんは気づいていませんでしたが、吾輩は彼女の部屋に入り込み、寝室に入り込むようになりました。彼女が疲れ果てて眠る横で、吾輩は静かに身体を寄
|
135 |
+
```
|
136 |
+
|
137 |
+
### 参考文献
|
138 |
+
|
139 |
+
[Chat Vectorを使って日本語LLMをチャットモデルに改造する #Python - Qiita](https://qiita.com/jovyan/items/ee6affa5ee5bdaada6b4)
|
140 |
+
[学習済みの LLM を束ねて Mixture of Experts を作るテク](https://zenn.dev/zaburo_ch/articles/88e35e5c80f974)
|