Este proyecto tiene como objetivo construir un modelo grande en idioma chino con una pequeña cantidad de parámetros, que se puede usar para comenzar a aprender rápidamente sobre modelos grandes. Si este proyecto es útil para usted, puede hacer clic en Iniciar.
Arquitectura del modelo: la arquitectura del modelo general adopta una arquitectura general de código abierto, que incluye: RMSNorm, RoPE, MHA, etc.
Detalles de implementación: Implemente el entrenamiento en dos etapas de modelos grandes y la posterior alineación humana, a saber: segmentación de palabras (Tokenizer) -> preentrenamiento (PTM) -> ajuste fino de instrucciones (SFT) -> alineación humana (RLHF, DPO) - > evaluación -> cuantificación - > Despliegue.
El proyecto se ha implementado y se puede experimentar en el siguiente sitio web.
Características del proyecto:
Bash
y admiten modelos de diferentes tamaños, como 16 m, 42 m, 92 m, 210 m, 440 m, etc.;Este proyecto tiene principalmente tres ramas. Se recomienda estudiar la rama principal. Las diferencias específicas son las siguientes:
main
tiny_llm
: alinee el modelo comunitario de código abierto, use la biblioteca Transformers para construir el modelo subyacente y también use la biblioteca Transformers para el entrenamiento con múltiples tarjetas y múltiples máquinas;tiny_llm
, modifica MLP
a un modelo MoE y usa la biblioteca Transformers para el entrenamiento con múltiples tarjetas y múltiples máquinas.Aviso:
doc
(en proceso de clasificación...) El modelo está alojado en Huggingface y ModeScope y se puede descargar automáticamente ejecutando código.
Se recomienda utilizar Huggingface para cargar el modelo en línea. Si no se puede ejecutar, pruebe ModeScope. Si necesita ejecutarlo localmente, modifique la ruta en model_id
al directorio local y podrá ejecutarlo.
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 )
Generar efectos
问:世界上最大的动物是什么?
答:目前已知最大的动物是蓝鲸(Balaenoptera musculus),这是一个庞大的哺乳动物,属于须鲸亚目、须鲸科中的最大物种。蓝鲸的身长可达30米以上,体重可达175吨。它们在海洋中生活,主要以浮游生物为食,如甲壳类动物和小型鱼类等。由于其巨大的体型和复杂的生态群落,蓝鲸成为海洋旅游的热门景点之一。
问:介绍一下刘德华。
答:刘德华是一位香港流行歌手、演员和导演,他在音乐界的贡献非常巨大。他是华语乐坛历史上最伟大的艺人之一,代表作品包括《爱我身体》和《肥皂泡》。他也经常参演电影和电视剧,并在电视上受到好评。
问:介绍一下中国。
答:中国是位于东亚的大陆,被欧洲以及亚洲和其他大陆所包围。它是中国第二大文明和世界上最大的经济体之一。中国的历史可以追溯到公元前5000年左右,从古至今都有其独特的文化和语言传承者。
Hay dos formas de crear un segmentador de palabras LLM: una es crear una lista de palabras usted mismo y entrenar un segmentador de palabras, la otra es seleccionar un segmentador de palabras entrenado por un modelo de código abierto.
Por conveniencia, este proyecto selecciona vocabulario de excelentes proyectos de código abierto. Teniendo en cuenta que el modelo entrenado es pequeño y el tamaño del vocabulario afecta el tamaño del modelo, se prefieren los proyectos de código abierto con un vocabulario más pequeño. Después de la comparación, se prefiere el vocabulario de ChatGLM3. Finalmente se selecciona la tabla, el tamaño de la tabla de palabras es 64798.
Para conocer el método para construir un vocabulario usted mismo, consulte tokenizer. El vocabulario de 32 K de LLaMA2 se expande a 50 K y se agrega un vocabulario chino de 20 K. Para conocer métodos de expansión detallados, consulte la documentación o tokenizer/README.md.
Nota: Este proyecto utiliza el vocabulario de ChatGLM3.
La estructura del modelo adopta una estructura similar a Llama2, que incluye: RMSNorm, RoPE, MHA, etc.;
Los detalles de los parámetros específicos son los siguientes:
modelo | tamaño oculto | tamaño intermedio | n_capas | n_cabezas | longitud máxima del contexto | parámetros | tamaño del vocabulario |
---|---|---|---|---|---|---|---|
pequeño-llm-16m | 120 | 384 | 6 | 6 | 512 | 16M | 64798 |
pequeño-llm-42m | 288 | 768 | 6 | 6 | 512 | 42M | 64798 |
pequeño-llm-92m | 512 | 1024 | 8 | 8 | 1024 | 92M | 64798 |
pequeño-llm-210m | 768 | 2048 | 16 | 12 | 1024 | 210M | 64798 |
pequeño-llm-440m | 1024 | 2816 | veinticuatro | 16 | 1024 | 440M | 64798 |
pequeño-llm-1_5b | 2048 | 5504 | veinticuatro | 16 | 1024 | 1,5 mil millones | 64798 |
Dado que la mayoría de los datos de entrenamiento y los datos de ajuste son datos chinos, el modelo se evalúa en los dos conjuntos de datos de C-Eval
y CMMLU
. La herramienta OpenCompass se utiliza para evaluar el modelo.
modelo | Tipo | Evaluación C | CMLU |
---|---|---|---|
pequeño-llm-92m | Base | 23.48 | 25.02 |
pequeño-llm-92m | Charlar | 26,79 | 26,59 |
El modelo Base se evalúa mediante el método de evaluación ppl; el modelo Chat se evalúa mediante el método gen. Las diferencias específicas se muestran en la siguiente figura:
Fuente: ¿Cuál es la diferencia entre el modo ppl y gen?
Nota: Solo se han evaluado dos modelos de uso común y las puntuaciones son bajas. La evaluación de los modelos restantes tiene poca importancia.
La demostración de la página web se ha implementado y se puede experimentar en el siguiente sitio web: ModeScope Tiny LLM
Si desea ejecutar la demostración de la página web localmente, preste atención a modificar la ruta del modelo model_id
en el archivo web_demo.py
e ingrese el siguiente comando para ejecutar:
streamlit run web_demo.py
La implementación del marco de Transfomers se encuentra en los archivos demo/infer_chat.py
y demo/infer_func.py
. No es muy diferente de otras operaciones de LLM. Solo preste atención al empalme de entradas.
Para una implementación detallada de vllm, consulte vllm
Si usa CUDA 12 o superior y PyTorch 2.1 o superior , puede usar directamente el siguiente comando para instalar vLLM.
pip install vllm==0.4.0
De lo contrario, consulte las instrucciones de instalación oficiales de vLLM.
Una vez completada la instalación, se requieren las siguientes operaciones ~
vllm/tinyllm.py
vllm/model_executor/models
correspondiente al entorno env. " TinyllmForCausalLM " : ( " tinyllm " , " TinyllmForCausalLM " ),
Dado que la estructura del modelo la define usted mismo, vllm no está implementado oficialmente y debe agregarlo manualmente.
Para obtener una implementación detallada de llama.cpp, consulte llama.cpp
El modelo Tiny LLM 92M ya es compatible con el marco de inferencia llama.cpp C ++. Se recomienda probar en el entorno Linux. El efecto no es bueno en Windows.
La versión compatible de llama.cpp es mi propia versión modificada y el enlace del almacén es: llama.cpp.tinyllm