Chinês |
Os parâmetros dos grandes modelos de idiomas geralmente são grandes e o computador de nível de consumidor é relativamente lento, muito menos querer treinar um modelo do zero. O objetivo deste projeto é treinar um modelo de idioma generativo de 0, incluindo limpeza de dados, treinamento de tokenizador, pré -treinamento de modelos, instrução SFT Fine -Tuning e otimização do RLHF.
O Chatlm-Mini-Chinese é um pequeno fp16
de diálogo chinês, e os parâmetros do modelo são apenas 0,2b (o peso certo de compartilhamento é batch_size=1
cerca de 210m). bf16
), float16
carregado e pelo menos o raciocínio é pelo menos apenas no raciocínio.
Huggingface
, incluindo transformers
, accelerate
, trl
, peft
, etc.trainer
, ele suporta cartas únicas de stand -inane, stand -com vários cartões para pré -treinamento e tunção fina SFT. Durante o processo de treinamento, suporte para parar em qualquer local e continuar treinando em qualquer local.Text-to-Text
e máscara de mask
pré-treinamento.sentencepiece
, huggingface tokenizers
;batch_size=1, max_len=320
, o suporte mínimo é pré -treinamento na memória de 16 GB+4 GB de memória;trainer
instruções trapsadas, o suporte, apoiando qualquer treinamento contínuo do ponto de interrupção;sequence to sequence
do Huggingface trainer
é fina -tened;peft lora
para otimização de preferências;Lora adapter
no modelo original.Se você precisar fazer uma pequena recuperação baseada em modelo e geração de aprimoramento (RAG), pode consultar meu outro projeto Phi2-mini-chinese, consulte Rag_with_langchain.ipynb
Atualizada recentemente
Todos os conjuntos de dados vêm de um conjunto de diálogo de roda única na Internet. Consulte utils/raw_data_process.py
. O principal conjunto de dados inclui:
Belle_open_source_1M
、 train_2M_CN
、及train_3.5M_CN
中部分回答较短、不含复杂表格结构、翻译任务 (没做英文词表)) , , 共3,7 milhões de linhas, 3,38 milhões de linhas após a limpeza.N
da enciclopédia é respondida, usando a enciclopédia de 202309
e os 1,19 milhão de solicitações de entrada restantes após a lavagem. Wiki Download: Zhwiki, converta o arquivo BZ2 baixado com wiki.txt Referência: Wikiextractor. O número total de conjuntos de dados é de 10,23 milhões: coleção de pré-treinamento de texto para texto: 9,3 milhões, conjunto de avaliação: 25.000 (porque a decodificação é lenta, o conjunto de avaliação não é definido muito). Conjunto de testes: 900.000. Consulte o seguinte conjunto de dados SFT Fine -Tuning e Otimização de DPO.
Modelo T5 (Transformador de transferência de texto em texto), consulte o artigo para obter detalhes: Experimando os limites do aprendizado de transferência com o transformador de texto de texto afiado.
O código -fonte do modelo vem do huggingface, consulte: T5forconditionalgeneration.
Consulte o Model_config.json, a camada oficial T5-base
: encoder layer
e decoder layer
são 12 camadas, e os dois parâmetros deste projeto são modificados para 10 camadas.
Parâmetros do modelo: 0,2b. Tamanho da palavra: 29298, apenas chinês e uma pequena quantidade de inglês.
Hardware:
# 预训练阶段:
CPU: 28 vCPU Intel(R) Xeon(R) Gold 6330 CPU @ 2.00GHz
内存:60 GB
显卡:RTX A5000(24GB) * 2
# sft及dpo阶段:
CPU: Intel(R) i5-13600k @ 5.1GHz
内存:32 GB
显卡:NVIDIA GeForce RTX 4060 Ti 16GB * 1
Treinamento do Tokenizer : A Biblioteca de Treinamento tokenizer
existente tem problemas de OOM ao encontrar um corpus grande; portanto, o número completo de corpus está da maneira como os métodos semelhantes BPE
, que levam meio dia de acordo com a palavra frequência e construtor.
Texto para texto pré-treinamento : taxa de aprendizado dinâmico com uma taxa de aprendizado de 1e-4
a 5e-3
, o pré-treinamento é de 8 dias. Perda de treinamento:
belle
para treinar conjuntos de dados (instruções e comprimentos de resposta abaixo de 512), a taxa de aprendizado com uma taxa de aprendizado dinâmica com uma taxa de aprendizado de 1e-7
a 5e-5
, tempo minimalizado por 2 dias. Formação de perda: rejected
le-5
RLHF fp16
: Conjunto de dados 2
- epoch
2
Data-Zh generate
texto chosen
. leva 3h. Perda de DPO: Use TextIteratorStreamer
do huggingface transformers
False
beam sample
greedy search
diálogo de stream_chat
cli_demo.py
Problemas existentes: o conjunto de dados pré -treinado é de apenas 9 milhões e os parâmetros do modelo são apenas 0,2b.
Se você não puder se conectar ao huggingface, use modelscope.snapshot_download
para baixar o arquivo de modelo do modelscope.
from transformers import AutoTokenizer , AutoModelForSeq2SeqLM
import torch
model_id = 'charent/ChatLM-mini-Chinese'
# 如果无法连接huggingface,打开以下两行代码的注释,将从modelscope下载模型文件,模型文件保存到'./model_save'目录
# from modelscope import snapshot_download
# model_id = snapshot_download(model_id, cache_dir='./model_save')
device = torch . device ( 'cuda' if torch . cuda . is_available () else 'cpu' )
tokenizer = AutoTokenizer . from_pretrained ( model_id )
model = AutoModelForSeq2SeqLM . from_pretrained ( model_id , trust_remote_code = True ). to ( device )
txt = '如何评价Apple这家公司?'
encode_ids = tokenizer ([ txt ])
input_ids , attention_mask = torch . LongTensor ( encode_ids [ 'input_ids' ]), torch . LongTensor ( encode_ids [ 'attention_mask' ])
outs = model . my_generate (
input_ids = input_ids . to ( device ),
attention_mask = attention_mask . to ( device ),
max_seq_len = 256 ,
search_type = 'beam' ,
)
outs_txt = tokenizer . batch_decode ( outs . cpu (). numpy (), skip_special_tokens = True , clean_up_tokenization_spaces = True )
print ( outs_txt [ 0 ])
Apple是一家专注于设计和用户体验的公司,其产品在设计上注重简约、流畅和功能性,而在用户体验方面则注重用户的反馈和使用体验。作为一家领先的科技公司,苹果公司一直致力于为用户提供最优质的产品和服务,不断推陈出新,不断创新和改进,以满足不断变化的市场需求。
在iPhone、iPad和Mac等产品上,苹果公司一直保持着创新的态度,不断推出新的功能和设计,为用户提供更好的使用体验。在iPad上推出的iPad Pro和iPod touch等产品,也一直保持着优秀的用户体验。
此外,苹果公司还致力于开发和销售软件和服务,例如iTunes、iCloud和App Store等,这些产品在市场上也获得了广泛的认可和好评。
总的来说,苹果公司在设计、用户体验和产品创新方面都做得非常出色,为用户带来了许多便利和惊喜。
Cuidado
prompt
modelo de response
é [EOS]
modelo TextToText
.
git clone --depth 1 https://github.com/charent/ChatLM-mini-Chinese.git
cd ChatLM-mini-Chinese
Este projeto é recomendado para usar python 3.10
.
Instalação PIP:
pip install -r ./requirements.txt
Se o PIP estiver instalado com a versão da CPU do Pytorch, você poderá instalar a versão CUDA do Pytorch da versão CUDA abaixo:
# pip 安装torch + cu118
pip3 install torch --index-url https://download.pytorch.org/whl/cu118
Instalação do CONDA:
conda install --yes --file ./requirements.txt
Use o comando git
para baixar o arquivo de peso e configuração do modelo Hugging Face Hub
, você precisa instalar o Git LFS primeiro e depois executar:
# 使用git命令下载huggingface模型,先安装[Git LFS],否则下载的模型文件不可用
git clone --depth 1 https://huggingface.co/charent/ChatLM-mini-Chinese
# 如果无法连接huggingface,请从modelscope下载
git clone --depth 1 https://www.modelscope.cn/charent/ChatLM-mini-Chinese.git
mv ChatLM-mini-Chinese model_save
Você também pode baixá-lo diretamente do repositório Hugging Face Hub
CHATLM-CHINESE-0.2B download artesanal e mover o arquivo baixado para o diretório model_save
.
Os requisitos da RAID são o mais completo possível.
Este projeto é principalmente a Enciclopédia Chinesa Wiki. Obtenha o Método Wiki Craid: Wiki Chinês Endereço do Download: Zhwiki, Faça o download zhwiki-[存档日期]-pages-articles-multistream.xml.bz2
File, cerca de 2,7 GB, converta o arquivo BZ2 baixado em Wiki.txt Referência: Wikiextractor, depois use o Python's Biblioteca OpenCC
para converter em chinês simplificado e, finalmente, colocar o wiki.simple.txt
obtido no diretório data
do diretório raiz do projeto. Multi -Corpse são mesclados em um arquivo txt
sozinho.
Como o tokenizador de treinamento é muito consumido, se o seu corpus é muito grande (os arquivos txt
mesclados excedem 2G), é recomendável provar o corpus de acordo com a categoria e proporção para reduzir o tempo de treinamento e o consumo de memória. O arquivo txt
com 1,7 GB de 1,7 GB precisa consumir cerca de 48 GB de memória (estimado, eu só tenho 32 GB, troca frequentemente de gatilho, o cartão do computador está preso por um longo tempo), 13600K CPU leva cerca de 1 hora.
A diferença entre char level
e byte level
é a seguinte (recupere as informações por conta própria). Se você treinar o Tokenizer of char level
Padrão, se precisar de byte level
, defina token_type='byte'
no train_tokenizer.py
.
# 原始文本
txt = '这是一段中英混输的句子, (chinese and English, here are words.)'
tokens = charlevel_tokenizer . tokenize ( txt )
print ( tokens )
# char level tokens输出
# ['▁这是', '一段', '中英', '混', '输', '的', '句子', '▁,', '▁(', '▁ch', 'inese', '▁and', '▁Eng', 'lish', '▁,', '▁h', 'ere', '▁', 'are', '▁w', 'ord', 's', '▁.', '▁)']
tokens = bytelevel_tokenizer . tokenize ( txt )
print ( tokens )
# byte level tokens输出
# ['Ġè¿Ļæĺ¯', 'ä¸Ģ段', 'ä¸Ńèĭ±', 'æ··', 'è¾ĵ', 'çļĦ', 'åı¥åŃIJ', 'Ġ,', 'Ġ(', 'Ġch', 'inese', 'Ġand', 'ĠEng', 'lish', 'Ġ,', 'Ġh', 'ere', 'Ġare', 'Ġw', 'ord', 's', 'Ġ.', 'Ġ)']
Comece a treinar:
# 确保你的训练语料`txt`文件已经data目录下
python train_tokenizer . py
{
"prompt" : "对于花园街,你有什么了解或看法吗? " ,
"response" : "花园街(是香港油尖旺区的一条富有特色的街道,位于九龙旺角东部,北至界限街,南至登打士街,与通菜街及洗衣街等街道平行。现时这条街道是香港著名的购物区之一。位于亚皆老街以南的一段花园街,也就是"波鞋街"整条街约150米长,有50多间售卖运动鞋和运动用品的店舖。旺角道至太子道西一段则为排档区,售卖成衣、蔬菜和水果等。花园街一共分成三段。明清时代,花园街是芒角村栽种花卉的地方。此外,根据历史专家郑宝鸿的考证:花园街曾是1910年代东方殷琴拿烟厂的花园。纵火案。自2005年起,花园街一带最少发生5宗纵火案,当中4宗涉及排档起火。2010年。2010年12月6日,花园街222号一个卖鞋的排档于凌晨5时许首先起火,浓烟涌往旁边住宅大厦,消防接报4 "
}
Jupyter-Lab ou Jupyter Notebook:
Consulte o arquivo train.ipynb
e recomendo usar o Jupyter-Lab para evitar ser morto após o processo terminal de desconexão com o servidor.
Console:
Se o treinamento do console precisar ser considerado morto após o processo interrompido, é recomendável usar o Supervisor
ou screen
dos Guardiões do processo para estabelecer uma sessão de conexão.
Primeiro de tudo, você deve configurar accelerate
, executar os seguintes comandos, selecionar de acordo com os prompts, consulte accelerate.yaml
, note: o DeepSpeed é mais problemático para instalar no Windows .
accelerate config
Inicie --config_file ./accelerate.yaml
treinamento accelerate launch
pre_train.py
dois scripts para pré -treinamento train.py
As informações de treinamento de treinadores exibidas neste projeto são mais bonitas e fáceis de modificar os detalhes do treinamento (como funções de perda, registros de log etc.), que suporta o treinamento contínuo do ponto de ctrl+c
. as informações do ponto de interrupção ao sair do script.
Cartão único -Machine Single:
# 本项目实现的trainer
accelerate launch ./train.py train
# 或者使用 huggingface trainer
python pre_train.py
Multi -Multi -Machine: 2
é o número de placas gráficas, modifique -o de acordo com sua situação real.
# 本项目实现的trainer
accelerate launch --multi_gpu --num_processes 2 ./train.py train
# 或者使用 huggingface trainer
accelerate launch --multi_gpu --num_processes 2 pre_train.py
Continue treinando do ponto de interrupção:
# 本项目实现的trainer
accelerate launch --multi_gpu --num_processes 2 ./train.py train --is_keep_training=True
# 或者使用 huggingface trainer
# 需要在`pre_train.py`中的`train`函数添加`resume_from_checkpoint=True`
accelerate launch --multi_gpu --num_processes 2 pre_train.py
Os conjuntos de dados SFT são todos contribuídos por Belle, obrigado. O conjunto de dados SFT é: gerado_chat_0.4m, tren_0.5m_cn e trens_2m_cn e cerca de 1,37 milhão de linhas após a lavagem. Instrução SFT FELE -Exemplos de conjunto de dados:
{
"prompt" : "解释什么是欧洲启示录" ,
"response" : "欧洲启示录(The Book of Revelation)是新约圣经的最后一卷书,也被称为《启示录》、《默示录》或《约翰默示录》。这本书从宗教的角度描述了世界末日的来临,以及上帝对世界的审判和拯救。 书中的主题包括来临的基督的荣耀,上帝对人性的惩罚和拯救,以及魔鬼和邪恶力量的存在。欧洲启示录是一个充满象征和暗示的文本,对于解读和理解有许多不同的方法和观点。 "
}
Consulte o arquivo parquet
de exemplo no diretório data
para parquet
seu próprio conjunto response
dados prompt
. Consulte o método True
train
no model/trainer.py
is_finetune
Se você precisar congelar outros parâmetros, ajuste o código sozinho.
Execute SFT Fine -Tuning:
# 本项目实现的trainer, 添加参数`--is_finetune=True`即可, 参数`--is_keep_training=True`可从任意断点处继续训练
accelerate launch --multi_gpu --num_processes 2 ./train.py --is_finetune=True
# 或者使用 huggingface trainer, 多GPU请用accelerate launch --multi_gpu --num_processes gpu个数 sft_train.py
python sft_train.py
O método de preferência é introduzido aqui: PPO e DPO, procure o artigo e os blogs para obter uma implementação específica.
Método PPO (otimização aproximada de preferência, otimização de políticas proximais)
Etapa 1: Use o conjunto de dados de tunção fina para supervisão e tunção fina (Finetuning supervisionado).
Etapa 2: Use o conjunto de dados de preferência (um prompt contém pelo menos 2 respostas, uma resposta que você deseja, não se deseja uma resposta. Múltiplas respostas podem ser classificadas de acordo com as pontuações, as pontuações mais desejadas) do modelo de treinamento (RM, RM , Rm, rm, rm, rm, rm, rm, rm, rm, modelo de recompensa). Você pode usar a biblioteca peft
para criar rapidamente o modelo de recompensa Lora.
Etapa 3: use o RM para realizar o treinamento de PPO de supervisão no modelo SFT, para que o modelo atenda à preferência.
Use DPO (otimização de preferência direta) é tuned ( DPO Fine -Tuning Method, que salva a memória de vídeo ) com base na obtenção do modelo SFT, nenhum modelo de recompensa de treinamento é necessário para obter respostas positivas (escolhidas) e respostas negativas. Você pode começar bem -TUN. O texto chosen
de ajuste fino vem do conjunto de dados original Alpaca-GPT4-Data-Zh, rejeitando modelos rejected
texto do modelo de Epoch de ajuste fino SFT e dois outros conjuntos de dados: Huozi_rlhf_data_json e rlHf-re-transkinese após a mesclagem A total de 80.000 dados DPO.
Consulte utils/dpo_data_process.py
.
Exemplos de dados de dados de otimização de preferência DPO:
{
"prompt" : "为给定的产品创建一个创意标语。,输入:可重复使用的水瓶。 " ,
"chosen" : " "保护地球,从拥有可重复使用的水瓶开始! " " ,
"rejected" : " "让你的水瓶成为你的生活伴侣,使用可重复使用的水瓶,让你的水瓶成为你的伙伴" "
}
Otimização de preferência da operação:
# 多GPU请用accelerate launch --multi_gpu --num_processes gpu个数 dpo_train.py
python dpo_train.py
Certifique-se de que Hugging Face Hub
os seguintes arquivos no diretório model_save
.
ChatLM-mini-Chinese
├─model_save
| ├─config.json
| ├─configuration_chat_model.py
| ├─generation_config.json
| ├─model.safetensors
| ├─modeling_chat_model.py
| ├─special_tokens_map.json
| ├─tokenizer.json
| └─tokenizer_config.json
python cli_demo.py
python api_demo.py
Exemplo de chamada da API:
curl --location ' 127.0.0.1:8812/api/chat '
--header ' Content-Type: application/json '
--header ' Authorization: Bearer Bearer '
--data ' {
"input_txt": "感冒了要怎么办"
} '
Tomando as três informações do grupo Yuan no texto como exemplo, faça o tunção fino a jusante. Veja o armazém pytorch_ie_model. Todos os três grupos de yuan no texto foram extraídos, como a frase 《写生随笔》是冶金工业2006年出版的图书,作者是张来亮
e o grupo Three Yuan (写生随笔,作者,张来亮)
e (写生随笔,出版社,冶金工业)
.
O conjunto de dados original é: o Baidu TRI -TRUMP desenha o conjunto de dados. Exemplo de conjuntos de dados finos obtidos pelo processamento:
{
"prompt" : "请抽取出给定句子中的所有三元组。给定句子:《家乡的月亮》是宋雪莱演唱的一首歌曲,所属专辑是《久违的哥们》 " ,
"response" : " [(家乡的月亮,歌手,宋雪莱),(家乡的月亮,所属专辑,久违的哥们)] "
}
Você pode usar o script sft_train.py
para fino -tune. Existem cerca de 17000
conjuntos de dados de treinamento, 5e-5
na taxa de aprendizado e época de treinamento 5
. A capacidade de diálogo de outras tarefas após a fina não desapareceu.
Efeito de filtragem: o conjunto de dados dev
百度三元组抽取数据集
como um conjunto de testes é comparado ao método tradicional pytorch_ie_model.
Modelo | Pontuação F1 | P | Lembre -se r |
---|---|---|---|
Chatlm-chinese-0.2b ajuste fino | 0,74 | 0,75 | 0,73 |
Chatlm-chinese-0.2b sem pré-treinamento | 0,51 | 0,53 | 0,49 |
Método de aprendizado profundo tradicional | 0,80 | 0,79 | 80.1 |
Observações: ChatLM-Chinese-0.2B无预训练
inicializa diretamente parâmetros aleatórios, iniciar o treinamento, a taxa de aprendizado 1e-4
e outros parâmetros são consistentes com o ajuste fino.
O modelo em si não usa treinamento de dados maior, nem o ajuste fino para obter instruções para responder a perguntas. Código de Avaliação C-EVAL Consulte: eval/c_eavl.ipynb
categoria | correto | question_count | conta |
---|---|---|---|
Humanidades | 63 | 257 | 24,51% |
Outro | 89 | 384 | 23,18% |
TRONCO | 89 | 430 | 20,70% |
Ciências sociais | 72 | 275 | 26,18% |
Se você acha que este projeto é útil para você, cite.
@misc{Charent2023,
author={Charent Chen},
title={A small chinese chat language model with 0.2B parameters base on T5},
year={2023},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {url{https://github.com/charent/ChatLM-mini-Chinese}},
}
Este projeto não assume os riscos e responsabilidades causados pela segurança dos dados, risco de opinião pública ou qualquer modelo que seja enganoso, abuso, disseminação e uso inadequado.