Целью этого проекта является создание большой модели китайского языка с небольшим количеством параметров, которую можно использовать для быстрого изучения знаний о больших моделях. Если этот проект вам полезен, вы можете нажать «Старт». Спасибо!
Архитектура модели: Общая архитектура модели использует общую архитектуру с открытым исходным кодом, включая: RMSNorm, RoPE, MHA и т. д.
Детали реализации: Реализовать двухэтапное обучение больших моделей и последующее человеческое выравнивание, а именно: сегментацию слов (Tokenizer) -> предварительное обучение (PTM) -> тонкую настройку инструкций (SFT) -> человеческое выравнивание (RLHF, DPO) — > оценка -> количественная оценка -> развертывание.
Проект развернут, и с ним можно ознакомиться на следующем веб-сайте.
Особенности проекта:
Bash
, поддерживающим модели разных размеров, например 16м, 42м, 92м, 210м, 440м и т.д.;Этот проект в основном имеет три ветки. Рекомендуется изучить основную ветку. Конкретные различия заключаются в следующем:
main
tiny_llm
: согласовать модель сообщества с открытым исходным кодом, использовать библиотеку Transformers для построения базовой модели, а также использовать библиотеку Transformers для обучения на нескольких картах и нескольких машинах;tiny_llm
измените слой MLP
на модель MoE и используйте библиотеку Transformers для обучения с несколькими картами и несколькими машинами.Уведомление:
doc
(в сортировке...) Модель размещена в Huggingface и ModeScope и может быть загружена автоматически путем запуска кода.
Рекомендуется использовать Huggingface для загрузки модели в Интернете. Если она не может запуститься, попробуйте ModeScope. Если вам нужно запустить ее локально, измените путь в model_id
к локальному каталогу, и вы сможете запустить ее.
pip install -r requirements.txt
from transformers import AutoTokenizer , AutoModelForCausalLM
from transformers . generation import GenerationConfig
model_id = "wdndev/tiny_llm_sft_92m"
tokenizer = AutoTokenizer . from_pretrained ( model_id , trust_remote_code = True )
model = AutoModelForCausalLM . from_pretrained ( model_id , device_map = "auto" , trust_remote_code = True )
generation_config = GenerationConfig . from_pretrained ( model_id , trust_remote_code = True )
sys_text = "你是由wdndev开发的个人助手。"
# user_text = "世界上最大的动物是什么?"
# user_text = "介绍一下刘德华。"
user_text = "介绍一下中国。"
input_txt = " n " . join ([ "<|system|>" , sys_text . strip (),
"<|user|>" , user_text . strip (),
"<|assistant|>" ]). strip () + " n "
generation_config . max_new_tokens = 200
model_inputs = tokenizer ( input_txt , return_tensors = "pt" ). to ( model . device )
generated_ids = model . generate ( model_inputs . input_ids , generation_config = generation_config )
generated_ids = [
output_ids [ len ( input_ids ):] for input_ids , output_ids in zip ( model_inputs . input_ids , generated_ids )
]
response = tokenizer . batch_decode ( generated_ids , skip_special_tokens = True )[ 0 ]
print ( response )
from modelscope import AutoModelForCausalLM , AutoTokenizer
model_id = "wdndev/tiny_llm_sft_92m"
tokenizer = AutoTokenizer . from_pretrained ( model_id , trust_remote_code = True )
model = AutoModelForCausalLM . from_pretrained ( model_id , device_map = "auto" , trust_remote_code = True )
sys_text = "你是由wdndev开发的个人助手。"
# user_text = "世界上最大的动物是什么?"
# user_text = "介绍一下刘德华。"
user_text = "介绍一下中国。"
input_txt = " n " . join ([ "<|system|>" , sys_text . strip (),
"<|user|>" , user_text . strip (),
"<|assistant|>" ]). strip () + " n "
model_inputs = tokenizer ( input_txt , return_tensors = "pt" ). to ( model . device )
generated_ids = model . generate ( model_inputs . input_ids , max_new_tokens = 200 )
generated_ids = [
output_ids [ len ( input_ids ):] for input_ids , output_ids in zip ( model_inputs . input_ids , generated_ids )
]
response = tokenizer . batch_decode ( generated_ids , skip_special_tokens = True )[ 0 ]
print ( response )
Создание эффектов
问:世界上最大的动物是什么?
答:目前已知最大的动物是蓝鲸(Balaenoptera musculus),这是一个庞大的哺乳动物,属于须鲸亚目、须鲸科中的最大物种。蓝鲸的身长可达30米以上,体重可达175吨。它们在海洋中生活,主要以浮游生物为食,如甲壳类动物和小型鱼类等。由于其巨大的体型和复杂的生态群落,蓝鲸成为海洋旅游的热门景点之一。
问:介绍一下刘德华。
答:刘德华是一位香港流行歌手、演员和导演,他在音乐界的贡献非常巨大。他是华语乐坛历史上最伟大的艺人之一,代表作品包括《爱我身体》和《肥皂泡》。他也经常参演电影和电视剧,并在电视上受到好评。
问:介绍一下中国。
答:中国是位于东亚的大陆,被欧洲以及亚洲和其他大陆所包围。它是中国第二大文明和世界上最大的经济体之一。中国的历史可以追溯到公元前5000年左右,从古至今都有其独特的文化和语言传承者。
Существует два способа создания сегментатора слов LLM: один — создать список слов самостоятельно и обучить сегментатор слов, другой — выбрать сегментатор слов, обученный с помощью модели с открытым исходным кодом.
Для удобства в этом проекте словарь выбран из отличных проектов с открытым исходным кодом. Учитывая, что обученная модель небольшая и размер словаря влияет на размер модели, предпочтительны проекты с открытым исходным кодом с меньшим словарным запасом. После сравнения словарь ChatGLM3. наконец выбрана таблица, размер таблицы слов равен 64798.
О методе самостоятельного создания словаря см. tokenizer. Словарь LLaMA2 из 32 КБ расширен до 50 КБ, а также добавлен китайский словарь из 20 КБ. Подробные методы расширения см. в документации или tokenizer/README.md.
Примечание. В этом проекте используется словарь ChatGLM3.
Структура модели имеет структуру, подобную Llama2, включая: RMSNorm, RoPE, MHA и т. д.;
Конкретные параметры параметров следующие:
модель | скрытый размер | промежуточный размер | n_layers | n_heads | максимальная длина контекста | параметры | размер словаря |
---|---|---|---|---|---|---|---|
крошечный-LLM-16м | 120 | 384 | 6 | 6 | 512 | 16М | 64798 |
крошечный-LLM-42м | 288 | 768 | 6 | 6 | 512 | 42М | 64798 |
крошечный-llm-92m | 512 | 1024 | 8 | 8 | 1024 | 92М | 64798 |
крошечный-llm-210m | 768 | 2048 | 16 | 12 | 1024 | 210М | 64798 |
крошечный-llm-440m | 1024 | 2816 | двадцать четыре | 16 | 1024 | 440М | 64798 |
крошечный-llm-1_5b | 2048 | 5504 | двадцать четыре | 16 | 1024 | 1,5Б | 64798 |
Поскольку большая часть данных обучения и данных точной настройки представляют собой китайские данные, модель оценивается на основе двух наборов данных C-Eval
и CMMLU
. Для оценки модели используется инструмент OpenCompass. Оценочные оценки следующие:
модель | Тип | C-Eval | КММЛУ |
---|---|---|---|
крошечный-llm-92m | База | 23.48 | 25.02 |
крошечный-llm-92m | Чат | 26,79 | 26.59 |
Базовая модель оценивается с использованием метода оценки ppl; модель Chat оценивается с использованием метода gen. Конкретные различия показаны на рисунке ниже:
Источник: В чем разница между режимом ppl и gen
Примечание. Были оценены только две широко используемые модели, и оценки низкие. Оценка остальных моделей не имеет большого значения.
Демо-версия веб-страницы развернута, и ее можно просмотреть на следующем веб-сайте: ModeScope Tiny LLM.
Если вы хотите запустить демонстрационную веб-страницу локально, обратите внимание на изменение пути модели model_id
в файле web_demo.py
и введите следующую команду для запуска:
streamlit run web_demo.py
Развертывание платформы Transformers находится в файлах demo/infer_chat.py
и demo/infer_func.py
. Оно мало чем отличается от других операций LLM. Просто обратите внимание на объединение входных данных.
Подробные сведения о развертывании vllm см. в разделе vllm.
Если вы используете CUDA 12 или более позднюю версию и PyTorch 2.1 или более позднюю версию , вы можете напрямую использовать следующую команду для установки vLLM.
pip install vllm==0.4.0
В противном случае обратитесь к официальным инструкциям по установке vLLM.
После завершения установки необходимо выполнить следующие операции~
vllm/tinyllm.py
в каталог vllm/model_executor/models
соответствующий среде env. " TinyllmForCausalLM " : ( " tinyllm " , " TinyllmForCausalLM " ),
Поскольку структура модели определяется вами, vllm официально не реализован и добавлять его нужно вручную.
Подробную информацию о развертывании llama.cpp см. в разделе llama.cpp.
Модель Tiny LLM 92M уже поддерживает структуру вывода C++ llama.cpp. Рекомендуется протестировать в среде Linux. В Windows эффект неудовлетворительный.
Поддерживаемая версия llama.cpp — это моя собственная модифицированная версия, а ссылка на хранилище: llama.cpp.tinyllm.