ChatGLM2-6B, entrenamiento del modelo ChatGLM-6B en su propio conjunto de datos en la práctica

Según el siguiente resumen de dos artículos de blogger:

ChatGLM2-6B, introducción al modelo ChatGLM-6B y capacitación práctica de su propio conjunto de datos_blog-CSDN de blog_dream_home8407

Tutorial detallado sobre la implementación del modelo ChatGLM-6B y el ajuste del blog-CSDN de fine-tuning_sawyes

introducir

A menudo se ve que durante las discusiones la distinción entre GLM-130B, modelo ChatGLM y ChatGLM-6B no es lo suficientemente clara. Aquí hay una explicación:

  • GLM-130B : Código abierto de Tsinghua Wisdom AI en agosto de 2022. Este gran modelo de lenguaje se basa en el GLM (modelo de lenguaje general) propuesto anteriormente y se ha ajustado en términos de procesamiento de normas, función de activación, mecanismo de máscara, etc. El propósito es entrenar un código abierto y un chino y de alta precisión abiertos. Modelo denso bilingüe en inglés, que puede generar más. Muchos desarrolladores utilizan cientos de miles de millones de modelos.
  • Modelo ChatGLM Billion : la solicitud para pruebas internas se lanzará en marzo de 2023 y la solicitud pública está actualmente suspendida. Este modelo tiene como objetivo resolver las deficiencias del modelo base grande en problemas complejos, conocimiento dinámico y escenarios de alineación humana. Basado en GLM-130B, introduce comentarios del usuario orientados al diálogo y afina las instrucciones para obtener un robot conversacional.
  • ChatGLM-6B : código abierto en marzo de 2023. Mientras realizaba pruebas internas del modelo ChatGLM 100 mil millones, el equipo de Tsinghua también lanzó una versión de la misma tecnología con una pequeña cantidad de parámetros, que es conveniente para que los desarrolladores aprendan y desarrollen (no comercial). La última versión es ChatGLM2-6B

ChatGLM-6B es un modelo de diálogo generado por texto de código abierto basado en el marco del Modelo de lenguaje general (GLM). Tiene 6.2 mil millones de parámetros. Combinado con la tecnología de destilación de modelos, en realidad se mide que la memoria de video superior (INT4) está ocupada por 2080ti. El entrenamiento de la tarjeta gráfica es de aproximadamente 6G.

ventaja:

1. Umbral de implementación más bajo: bajo la media precisión de FP16, ChatGLM-6B necesita al menos 13 GB de memoria de video para razonar. Combinado con la tecnología de cuantificación del modelo, el primer requisito se puede reducir aún más a 10 GB (INT8) y 6 GB (INT4), lo que hace ChatGLM-6B se puede implementar en tarjetas gráficas de consumo.
2. Longitud de secuencia más larga: en comparación con GLM-10B (longitud de secuencia 1024), ChatGLM2-6B tiene una longitud de secuencia de 32K, lo que admite conversaciones y aplicaciones más largas.
3. Entrenamiento de alineación de la intención humana: se utilizan el ajuste fino supervisado, el arranque de retroalimentación y el aprendizaje por refuerzo a partir de la retroalimentación humana para que el modelo sea inicialmente capaz de comprender la intención de la instrucción humana. El formato de salida es rebajado para una fácil visualización. En la actualidad, el método de ajuste de la supervisión es de código abierto.

insuficiente:

1. La capacidad del modelo es pequeña: la pequeña capacidad de 6B determina su memoria de modelo y su capacidad de lenguaje relativamente débiles. A medida que aumentan el número y las rondas de sus propios datos de entrenamiento, perderá gradualmente su capacidad de diálogo original. Zhipu AI Yu Kuifei El mejor Los datos de entrenamiento proporcionados por el médico son aproximadamente 1000 piezas.

2. Débil capacidad de diálogo de múltiples turnos: la capacidad de comprensión del contexto de ChatGLM-6B no es suficiente. Cuando se enfrenta a escenarios de generación de respuestas largas y diálogo de múltiples turnos, pueden ocurrir pérdida de contexto y errores de comprensión. Solución: en forma de una base de conocimientos complementaria, como ChatGLM-6B combinada con langchain para implementar un enlace de base de conocimientos local

3. Después de entrenar sus propios datos, olvidará la capacidad de tener conversaciones anteriores, lo que resultará en un olvido catastrófico. La solución es agregar un conjunto de datos de ajuste fino de conversación de código abierto general a sus propios datos de campo profesional para entrenar juntos.

La diferencia entre ChatGLM2-6B y ChatGLM-6B:

ChatGLM2-6B es la versión de segunda generación del modelo de conversación bilingüe chino-inglés de código abierto ChatGLM-6B. Si bien conserva muchas características excelentes del modelo de primera generación, como una conversación fluida y un umbral de implementación bajo, ChatGLM2-6B presenta las siguientes novedades características:
Rendimiento potente actualizado: según la experiencia de desarrollo del modelo ChatGLM de primera generación, hemos actualizado integralmente el modelo base de ChatGLM2-6B. ChatGLM2-6B utiliza la función objetivo híbrida de GLM y se ha sometido a un entrenamiento previo de identificadores en chino e inglés de 1.4T y a un entrenamiento de alineación de preferencias humanas. Los resultados de la evaluación muestran que, en comparación con el modelo de primera generación, ChatGLM2-6B tiene un mejor rendimiento en MMLU (+23%), CEval El rendimiento en conjuntos de datos como (+33%), GSM8K (+571%) y BBH (+60%) ha mejorado enormemente y es altamente competitivo entre los modelos de código abierto de el mismo tamaño.

Contexto más largo: basado en la tecnología FlashAttention, ampliamos la longitud del contexto (Longitud del contexto) del modelo de pedestal de 2K de ChatGLM-6B a 32K, y utilizamos un entrenamiento de longitud de contexto de 8K en la etapa de diálogo, lo que permite más rondas de diálogo. Sin embargo, la versión actual de ChatGLM2-6B tiene una capacidad limitada para comprender documentos ultralargos de una sola ronda. Nos centraremos en la optimización en actualizaciones iterativas posteriores.
Razonamiento más eficiente: basado en la tecnología de atención de consultas múltiples, ChatGLM2-6B tiene una velocidad de razonamiento más eficiente y un menor uso de memoria de video: bajo la implementación del modelo oficial, la velocidad de razonamiento es un 42% mayor que la de la primera generación. Bajo la cuantificación INT4, 6G La duración de la conversación admitida por la memoria de video se ha incrementado de 1K a 8K.
Un protocolo más abierto: los pesos ChatGLM2-6B están completamente abiertos a la investigación académica y también permiten el uso comercial con permiso oficial por escrito.

Sintonia FINA:

1.1, el método de capacitación oficial de código abierto ChatGLM2-6B se basa en el ajuste fino de P-Tuning v2:
Enlace:  git_link
Basado en QLoRA
Enlace:  git_link

1.2, ChatGLM-6B está ajustado según P-Tuning v2:
enlace:  git_link

conjunto de datos:

Enlace de descarga de datos de muestra
Enlace:  Dataset
convierte su propio conjunto de datos al siguiente formato:

{
    "content": "类型#上衣*版型#宽松*版型#显瘦*图案#线条*衣样式#衬衫*衣袖型#泡泡袖*衣款式#抽绳",
    "summary": "这件衬衫的款式非常的宽松,利落的线条可以很好的隐藏身材上的小缺点,穿在身上有着很好的显瘦效果。领口装饰了一个可爱的抽绳,漂亮的绳结展现出了十足的个性,配合时尚的泡泡袖型,尽显女性甜美可爱的气息。"
}

Si necesita utilizar datos de conversación de varios turnos para ajustar el modelo, puede proporcionar el historial de chat. Por ejemplo, los siguientes son los datos de entrenamiento de una conversación de tres turnos:

{"prompt": "长城h3风扇不转。继电器好的。保险丝好的传感器新的风扇也新的这是为什么。就是继电器缺一个信号线", "response": "用电脑能读数据流吗?水温多少", "history": []}
{"prompt": "95", "response": "上下水管温差怎么样啊?空气是不是都排干净了呢?", "history": [["长城h3风扇不转。继电器好的。保险丝好的传感器新的风扇也新的这是为什么。就是继电器缺一个信号线", "用电脑能读数据流吗?水温多少"]]}
{"prompt": "是的。上下水管都好的", "response": "那就要检查线路了,一般风扇继电器是由电脑控制吸合的,如果电路存在断路,或者电脑坏了的话会出现继电器不吸合的情况!", "history": [["长城h3风扇不转。继电器好的。保险丝好的传感器新的风扇也新的这是为什么。就是继电器缺一个信号线", "用电脑能读数据流吗?水温多少"], ["95", "上下水管温差怎么样啊?空气是不是都排干净了呢?"]]}

Durante el entrenamiento, debe especificar --history_column como la clave del historial de chat en los datos (historial en este ejemplo), y el historial de chat se unirá automáticamente. Tenga en cuenta que el contenido que supere la longitud de entrada max_source_length se truncará.

Puede consultar las siguientes instrucciones:

bash train_chat.sh

Problemas de encuentro:

1. Cómo ejecutar el script .sh, instalar git, abrir Git Bash y ejecutar.

2. Ajuste y configure el entorno venv por separado para evitar conflictos de versiones:

$ python -m venv venv
$ source venv/Scripts/activate


3. Web_demo.py tiene problemas:

(1) La ruta "THUDM/chatglm-6b" no se puede leer, reemplácela con "THUDM\\chatglm-6b"

  (2) No hay respuesta al ejecutar bash train.sh. Modifique "CUDA_VISIBLE_DEVICES=0 python3 main.py \" a "CUDA_VISIBLE_DEVICES=0 python main.py \"

(3) En la terminal PyCharm, cuda no se pudo cargar. No lo estudié en detalle. Simplemente cambie a la terminal Git Bash.

(4) Guión de prueba

import os
import torch
from transformers import AutoConfig, AutoModel, AutoTokenizer


MODEL_PATH = "THUDM\\chatglm-6b"
CHECKPOINT_PATH = "ptuning\\output\\adgen-chatglm-6b-pt-128-2e-2\\checkpoint-3000"

# 载入Tokenizer
tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH, trust_remote_code=True)

config = AutoConfig.from_pretrained(MODEL_PATH, trust_remote_code=True, pre_seq_len=128)
model = AutoModel.from_pretrained(MODEL_PATH, config=config, trust_remote_code=True).cuda()

prefix_state_dict = torch.load(os.path.join(CHECKPOINT_PATH, "pytorch_model.bin"))
new_prefix_state_dict = {}

for k, v in prefix_state_dict.items():
    if k.startswith("transformer.prefix_encoder."):
        new_prefix_state_dict[k[len("transformer.prefix_encoder."):]] = v
model.transformer.prefix_encoder.load_state_dict(new_prefix_state_dict)

print(f"Quantized to 4 bit")
model = model.quantize(4)
model = model.half().cuda()
model.transformer.prefix_encoder.float()
model = model.eval()


print("用户:你好\n")
response, history = model.chat(tokenizer, "你好", history=[])
print("ChatGLM-6B:\n",response)
print("\n------------------------------------------------\n用户:")

line = input()
while line:
    response, history = model.chat(tokenizer, line, history=history)
    print("ChatGLM-6B:\n", response)
    print("\n------------------------------------------------\n用户:")
    line = input()

Ejemplo rápido:

# 调用函数示例
# 要求
Q = "对方不满意你的付出,你为此而感到很难过,是吗?"
# 问题模板
Q_motif = f"你是一个心理咨询师,熟悉心理咨询需要遵循的隐私和伦理规范,请根据我提供的心理咨询师的回复,推荐3-5个语义相同但是表达近似的替代回复。" \
      "心理咨询师的回复:{Q}。" \
      "请务必保证自己推荐的内容满足条件。需要满足限定条件中的每个细节。"
print("Q:"+Q_motif)
# 获取结果
result=glm_single_QA(model,tokenizer,Q_motif,2048,2048)
print("A:"+result)


 

Supongo que te gusta

Origin blog.csdn.net/chaishen10000/article/details/131632484
Recomendado
Clasificación