File size: 6,698 Bytes
f35b84e
d7645f9
 
 
f35b84e
 
 
 
 
d7645f9
 
f35b84e
 
 
 
 
28b4310
f35b84e
28b4310
5ffc8db
7a3f05f
9e1b489
34c71df
 
f35b84e
2b00460
f35b84e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ab1b42e
f35b84e
e0f5e25
f35b84e
bf46e38
 
 
f35b84e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ffcf760
 
 
 
 
 
 
 
 
 
 
 
 
 
f35b84e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bf46e38
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
---
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)