🚀 Firefly(流螢): 中国語対話型大規模言語モデル
Firefly(流螢) はオープンソースの中国語対話型大規模言語モデルです。指令微調整(Instruction Tuning)を使用して中国語データセットで微調整を行っています。同時に、語彙カット、ZeRO、テンソル並列などの技術を用いることで、メモリ消費を効果的に削減し、トレーニング効率を向上させています。トレーニングでは、より少ないモデルパラメータと計算リソースを使用しています。
また、中国文化に関連する多くのデータを構築し、対聯、詩作り、文言文翻訳、散文、金庸小説などの分野でのモデルの性能を向上させています。
流螢(蛍の別名)は中国の伝統文化の象徴です。腐草が蛍になるという悲しい意味を持ちますが、蛍の光は小さいですが、薄い光で夜空を照らすことができます。このプロジェクトの名前は杜牧の「秋夕」から取られています:銀燭秋光冷画屏、軽羅小扇撲流螢。このプロジェクトが流螢のように薄い光を放ち、中国語NLPのオープンソースコミュニティに少しでも貢献できることを願っています。
《詠螢火》
唐・李白
雨打灯難滅、
風吹色更明。
若飛天上去、
定作月邊星。
🚀 クイックスタート
プロジェクトのアドレスはこちらです:Firefly(流螢): 中国語対話型大規模言語モデル 。もしこのモデルがあなたに役立つと思ったら、このモデルをいいねし、GitHubのプロジェクトでスターをつけてください。

✨ 主な機能
- データセット:firefly-train-1.1M 。110万件の中国語多タスク指令微調整データセットで、23種類の一般的な中国語NLPタスクの指令データが含まれています。各タスクについて、人工的にいくつかの指令テンプレートを作成し、データの高品質と豊富さを保証しています。
- モデルカット:LLMPruner:大規模言語モデルカットツール 。語彙カット技術を使用して多言語大規模言語モデルの重みをカットし、事前学習の知識を保持したまま、モデルのパラメータ数を効果的に削減し、トレーニング効率を向上させます。カット後のさまざまなパラメータ規模のBloomモデルの重みも共有しています。
- 重み共有:bloom-1b4-zh とbloom-2b6-zh をベースに指令微調整を行い、2種類のパラメータ規模の中国語モデル:firefly-1b4 とfirefly-2b6 を取得しました。
- トレーニングコード:トレーニングコードをオープンソースで公開しています。テンソル並列、ZeRO、Gemini異種メモリ空間管理などの大規模モデルトレーニング戦略をサポートしています。1枚のGPUで1B - 2Bパラメータ規模のモデルをトレーニングすることができます(整理後にオープンソース化予定)。
💻 使用例
基本的な使用法
from transformers import BloomTokenizerFast, BloomForCausalLM
device = 'cuda'
path = 'YeungNLP/firefly-2b6'
tokenizer = BloomTokenizerFast.from_pretrained(path)
model = BloomForCausalLM.from_pretrained(path)
model.eval()
model = model.to(device)
text = input('User:')
while True:
text = '<s>{}</s></s>'.format(text)
input_ids = tokenizer(text, return_tensors="pt").input_ids
input_ids = input_ids.to(device)
outputs = model.generate(input_ids, max_new_tokens=200, do_sample=True, top_p=0.7, temperature=0.35,
repetition_penalty=1.2, eos_token_id=tokenizer.eos_token_id)
rets = tokenizer.batch_decode(outputs)
output = rets[0].strip().replace(text, "").replace('</s>', "")
print("Firefly:{}".format(output))
text = input('User:')
🔧 技術詳細
トレーニング時には、各サンプルのinputとtargetを以下の形式に処理してからモデルに入力します。
<s>input</s></s>target</s>
モデルの最大入力を512に設定し、input部分は損失関数の計算には含まれず、target部分の損失関数のみを計算します。トレーニングのハイパーパラメータ設定は以下の表の通りです。
パラメータ |
firefly-1b4 |
firefly-2b6 |
Batch size |
16 |
8 |
Learning rate |
3e-5 |
3e-5 |
Warmup step |
3000 |
3000 |
Lr schedule |
cosine |
cosine |
Max_seq_length |
512 |
512 |
Training step |
90k |
260k |
トレーニングデータセット |
160万 |
210万 |
📄 ライセンス
語彙カット後のモデルのパラメータ数は14億と26億で、ChatGPTやLLaMAなどの数百億、数千億のモデルに比べてはるかに少なく、現在の主流のBelleやChatGLMなどの70億程度のモデルに比べても少ないです。そのため、以下のような問題がまだ存在します。
- 事実関連の知識について、誤った回答を返すことがあります。
- 無害化微調整を行っていないため、差別的、有害な、倫理道徳に反する発言をする可能性があります。
- コードや推論能力に欠けています。
上記のモデルの制限に基づき、このプロジェクトのコード、データ、モデルなどは学術研究のみに使用し、商業目的や社会に危害を与える目的で使用しないでください。
引用
このプロジェクトのデータ、コード、またはモデルを使用する場合は、このプロジェクトを引用してください。
@misc{Firefly,
author = {Jianxin Yang},
title = {Firefly(流螢): 中国語対話型大規模言語モデル},
year = {2023},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/yangjianxin1/Firefly}},
}
フォローしてくれると嬉しいです!

生成結果
コード生成
firefly-2b6は一定のコード生成能力を備えています。
- Pythonでバブルソートアルゴリズムを書いてください。
以下はPythonのバブルソートアルゴリズムのコードです。
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n-i-1):
if arr[j] > arr[j+1] :
arr[j], arr[j+1] = arr[j+1], arr[j]
return arr
arr = [64, 34, 25, 12]
sorted_arr = bubble_sort(arr)
print("原始数组:", arr)
print("排序后的数组:", sorted_arr)
出力結果は以下の通りです。
原始数组: [25, 12, 64, 34]
排序后的数组: [12, 25, 34, 64]
このアルゴリズムの時間計算量はO(n^2)です。
- Pythonでクイックソートアルゴリズムを実装してください。入力は配列で、ソート後の配列を返します。
以下はPythonで実装したクイックソートアルゴリズムのコードです。
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
この関数は整数のリストを引数として受け取り、リストを昇順にソートします。リストの長さが1以下の場合は、元のリストをそのまま返します。それ以外の場合は、中央の要素を新しいピボットとして、残りの要素に対してクイックソートアルゴリズムを再帰的に呼び出し、リスト全体がソートされるまで繰り返します。
実際のアプリケーションでは、この関数を使用して任意のサイズの配列をクイックソートすることができます。
- Pythonで二分探索アルゴリズムを書いてください。
以下は簡単なPythonコードの実装です。
def binary_search(arr, x):
left = 0
right = len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == x:
return mid
elif arr[mid] < x:
left = mid + 1
else:
right = mid - 1
return -1
この関数は2つの引数arr
と探索対象の要素x
を受け取り、配列内で目標値に最も近いインデックスを返します。目標値が存在しない場合は、-1を返します。
- 配列内の偶数の数を計算する関数を書いてください。入力は配列で、出力は偶数の数です。
以下はPythonコードの実装です。
def count_even_numbers(nums):
even_count = 0
for num in nums:
if num % 2 == 0:
even_count += 1
return even_count
この関数はまずforループを使用して配列全体を走査し、各要素が偶数かどうかを判断します。偶数の場合は、even_count
変数に加算します。最後にeven_count
の値を返すことで、配列内の偶数の数を取得できます。
- HTMLで教务管理システムのログイン画面を生成してください。ユーザー名、パスワード入力ボックスとログインボタンを含める必要があります。
<html>
<head>
<title>教务管理システム</title>
</head>
<body>
<h1>このシステムをご利用いただき、ありがとうございます!</h1>
<form action='set_username' method='POST'>
<label for="username">ユーザー名を入力してください:</label>
<input type="text" id="username" name="username"><br><br>
<label for="password">パスワードを入力してください:</label>
<input type="password" id="password" name="password"><br><br>
<button type="submit" value="ログイン">ログイン</button>
</form>
</body>
</html>
その他の例
firefly-1b4と比較して、firefly-2b6は他の分野でも能力が向上しています。文言文翻訳、対聯、古詩創作などが含まれます。
入力 |
出力 |
以下の文章を文言文に翻訳してください:到了春风和煦,阳光明媚的时候,湖面平静,没有惊涛骇浪,天色湖光相连,一片碧绿,广阔无际;沙洲上的鸥鸟,时而飞翔,时而停歇,美丽的鱼游来游去,岸上与小洲上的花草,青翠欲滴。有时大片烟雾完全消散,皎洁的月光一泻千里,波动的光闪着金色,静静的月影像沉入水中的玉璧,渔夫的歌声在你唱我和地响起来,这种乐趣真是无穷无尽啊! |
及春日和暖,晴景霁然,波平无澜,天影连相,一碧万顷,洲渚鸥鹭,或翔或止,佳鱼往来,岸上草木,青翠有馀,或大雾顿消,皓月一洒千里,浮光金辉,幽影沈璧,渔人歌咏,自唱我与,此乐何极! |
以下の文章を現代語に翻訳してください:林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。 |
森の果てに水源があり、そこには山があり、山には小さな穴があり、光が漏れているようです。船を捨てて、穴から入ります。最初は非常に狭く、一人が通れる程度です。数十歩進むと、突然開けた空間が広がります。土地は平らで広く、家屋は整然と並んでおり、良田、美しい池、桑や竹などがあります。田んぼの道が交差し、鶏や犬の鳴き声が聞こえます。中を往来する人々は耕作しており、男女の服装はすべて外の人と同じです。 |
対聯:雀躍黄山,仙人指路松迎客 |
下联:龍騰紫氣,玉女牽衣月送春 |
詠春を題材に、燕、春風、柳などの要素を含む古詩を書いてください。 |
燕飛柳絮舞、春風吹緑波。 花開如錦繡、鳥語似笙歌。 鶯啼声不断、蝶舞影婆娑。 人間有真楽、何必更尋多。 |
詠梅を題材に、梅、白雪などの要素を含む古詩を書いてください。 |
寒枝瘦骨傲霜風、清香不減梅花紅。玉潔冰姿照人眼、素肌如雪映寒空。 |
「明月松間照」から始まる古詩を生成してください。 |
明月松間照,清泉石上流。 竹喧归浣女,莲动下渔舟。 随意春芳歇,王孙自可留。 |