Este projeto visa construir um grande modelo em chinês com um pequeno número de parâmetros, que pode ser usado para começar a aprender rapidamente sobre modelos grandes. Se este projeto for útil para você, clique em Iniciar.
Arquitetura do modelo: A arquitetura geral do modelo adota arquitetura geral de código aberto, incluindo: RMSNorm, RoPE, MHA, etc.
Detalhes de implementação: Implementar treinamento em dois estágios de grandes modelos e posterior alinhamento humano, a saber: segmentação de palavras (Tokenizer) -> pré-treinamento (PTM) -> ajuste fino de instrução (SFT) -> alinhamento humano (RLHF, DPO) - > avaliação -> quantificação -> Implantação.
O projeto foi implantado e pode ser vivenciado no site a seguir.
Recursos do projeto:
Bash
, suportando modelos de diversos tamanhos, como 16m, 42m, 92m, 210m, 440m, etc.;Este projeto possui principalmente três ramos. Recomenda-se estudar o ramo principal. As diferenças específicas são as seguintes:
main
tiny_llm
: Alinhe o modelo de comunidade de código aberto, use a biblioteca Transformers para construir o modelo subjacente e também use a biblioteca Transformers para treinamento de várias placas e máquinas;tiny_llm
, modifique MLP
para um modelo MoE e use a biblioteca Transformers para treinamento de várias placas e máquinas.Perceber:
doc
(sendo classificada...) O modelo está hospedado no Huggingface e ModeScope e pode ser baixado automaticamente executando o código.
Recomenda-se usar Huggingface para carregar o modelo online. Se não puder ser executado, tente ModeScope. Se precisar executá-lo localmente, modifique o caminho em model_id
para o diretório local e você poderá executá-lo.
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 )
Gerar efeitos
问:世界上最大的动物是什么?
答:目前已知最大的动物是蓝鲸(Balaenoptera musculus),这是一个庞大的哺乳动物,属于须鲸亚目、须鲸科中的最大物种。蓝鲸的身长可达30米以上,体重可达175吨。它们在海洋中生活,主要以浮游生物为食,如甲壳类动物和小型鱼类等。由于其巨大的体型和复杂的生态群落,蓝鲸成为海洋旅游的热门景点之一。
问:介绍一下刘德华。
答:刘德华是一位香港流行歌手、演员和导演,他在音乐界的贡献非常巨大。他是华语乐坛历史上最伟大的艺人之一,代表作品包括《爱我身体》和《肥皂泡》。他也经常参演电影和电视剧,并在电视上受到好评。
问:介绍一下中国。
答:中国是位于东亚的大陆,被欧洲以及亚洲和其他大陆所包围。它是中国第二大文明和世界上最大的经济体之一。中国的历史可以追溯到公元前5000年左右,从古至今都有其独特的文化和语言传承者。
Existem duas maneiras de construir um segmentador de palavras LLM: uma é construir você mesmo uma lista de palavras e treinar um segmentador de palavras; a outra é selecionar um segmentador de palavras treinado por um modelo de código aberto;
Por uma questão de conveniência, este projeto seleciona vocabulário de excelentes projetos de código aberto. Considerando que o modelo treinado é pequeno e o tamanho do vocabulário afeta o tamanho do modelo, os projetos de código aberto com vocabulário menor são preferidos. Após comparação, o vocabulário do ChatGLM3. é finalmente selecionada, o tamanho da tabela de palavras é 64798.
Para obter o método de construção de um vocabulário por conta própria, consulte tokenizer. O vocabulário de 32K do LLaMA2 foi expandido para 50K e um vocabulário chinês de 20K foi adicionado. Para métodos de expansão detalhados, consulte a documentação ou tokenizer/README.md.
Nota: Este projeto utiliza o vocabulário do ChatGLM3.
A estrutura do modelo adota uma estrutura semelhante ao Llama2, incluindo: RMSNorm, RoPE, MHA, etc.;
Os detalhes específicos dos parâmetros são os seguintes:
modelo | tamanho oculto | tamanho intermediário | n_camadas | n_cabeças | comprimento máximo do contexto | parâmetros | tamanho do vocabulário |
---|---|---|---|---|---|---|---|
minúsculo-llm-16m | 120 | 384 | 6 | 6 | 512 | 16 milhões | 64798 |
minúsculo-llm-42m | 288 | 768 | 6 | 6 | 512 | 42 milhões | 64798 |
minúsculo-llm-92m | 512 | 1024 | 8 | 8 | 1024 | 92 milhões | 64798 |
minúsculo-llm-210m | 768 | 2048 | 16 | 12 | 1024 | 210 milhões | 64798 |
minúsculo-llm-440m | 1024 | 2816 | vinte e quatro | 16 | 1024 | 440 milhões | 64798 |
minúsculo-llm-1_5b | 2048 | 5504 | vinte e quatro | 16 | 1024 | 1,5B | 64798 |
Como a maioria dos dados de treinamento e de ajuste fino são dados chineses, o modelo é avaliado nos dois conjuntos de dados de C-Eval
e CMMLU
. A ferramenta OpenCompass é usada para avaliar o modelo.
modelo | Tipo | Avaliação C | CMMLU |
---|---|---|---|
minúsculo-llm-92m | Base | 23h48 | 25.02 |
minúsculo-llm-92m | Bater papo | 26,79 | 26,59 |
O modelo Base é avaliado usando o método de avaliação ppl; o modelo Chat é avaliado usando o método gen. As diferenças específicas são mostradas na figura abaixo:
Fonte: Qual é a diferença entre o modo ppl e gen
Nota: Apenas dois modelos comumente utilizados foram avaliados e as pontuações são baixas. A avaliação dos demais modelos é de pouca importância.
A página Demo foi implantada e pode ser experimentada no seguinte site: ModeScope Tiny LLM
Se você deseja executar a demonstração da página da web localmente, preste atenção ao modificar o caminho do modelo model_id
no arquivo web_demo.py
e digite o seguinte comando para executar:
streamlit run web_demo.py
A implantação da estrutura do Transfomers está localizada nos arquivos demo/infer_chat.py
e demo/infer_func.py
. Não é muito diferente de outras operações LLM.
Para implantação detalhada do vllm, consulte vllm
Se você usar CUDA 12 ou superior e PyTorch 2.1 ou superior , poderá usar diretamente o seguinte comando para instalar o vLLM.
pip install vllm==0.4.0
Caso contrário, consulte as instruções oficiais de instalação do vLLM.
Após a conclusão da instalação, as seguintes operações são necessárias ~
vllm/tinyllm.py
para vllm/model_executor/models
correspondente ao ambiente env. " TinyllmForCausalLM " : ( " tinyllm " , " TinyllmForCausalLM " ),
Como a estrutura do modelo é definida por você, o vllm não está implementado oficialmente e você precisa adicioná-lo manualmente.
Para implantação detalhada do llama.cpp, consulte llama.cpp
O modelo Tiny LLM 92M já suporta a estrutura de inferência C++ llama.cpp. Recomenda-se testar no ambiente Linux.
A versão suportada de llama.cpp é minha própria versão modificada e o link do warehouse é: llama.cpp.tinyllm