Qual é o formato para fazer fine tuning neste modelo?

#1
by celsowm - opened

Olá !
Primeiramente, parabéns pelo trabalho de vocês !

Estou tentando fazer fine tuning com um data set de perguntas e respostas, porém, não sei qual seria o formato correto para usar no SFTTrainer, se seria:

<s>[INST] <<SYS>>
{{ system_prompt }}
<</SYS>>

{{ user_message }} [/INST]

ou que está no card:

Abaixo está uma instrução que descreve uma tarefa. Escreva uma resposta que complete adequadamente o pedido.

### Instrução:
{instruction}

### Resposta:"""

Qual devo usar?

celsowm changed discussion title from Qual é o formato para fazer fine tuning deste modelo? to Qual é o formato para fazer fine tuning neste modelo?
Recogna NLP org

Olá Celso, tudo bem?

Muito obrigado pela participação!

Em relação ao fine tuning que utilizamos para desenvolver o Bode, utilizamos a Adaptação de Baixo Rank (LoRA) que é uma técnica para facilitar a adaptação de LLMs pré-treinadas para novas tarefas. A LoRA propõe congelar os pesos do modelo pré-treinado e injetar camadas treináveis (matrizes de decomposição de classificação) em cada bloco de transformadores. Isso reduz muito o número de parâmetros treináveis e os requisitos de memória da GPU, uma vez que os gradientes não precisam ser computados para a maioria dos pesos do modelo.

No que diz respeito ao uso do SFTTrainer, seria necessário realizar uma análise para verificar se há alguma normatização específica de treinamento ou a presença de tokens especiais. No entanto, caso não haja uma padronização definida, é possível adotar qualquer formato desejado, seja aquele estabelecido na LLM Bode ou qualquer outro padrão de preferência.

Agradecemos imensamente pela sua participação e colocamo-nos à disposição para quaisquer esclarecimentos adicionais.

Olá @recogna , boa noite !
Obrigado pela resposta ! Primeira coisa, descobri que o exemplo do card de vocês pode funcionar de maneira mais simples usando o pipeline, olha:

from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM
from peft import PeftModel, PeftConfig

llm_model = 'recogna-nlp/bode-7b-alpaca-pt-br'

config = PeftConfig.from_pretrained(llm_model)
model = AutoModelForCausalLM.from_pretrained(config.base_model_name_or_path, trust_remote_code=True, return_dict=True, load_in_8bit=True, device_map='auto')
tokenizer = AutoTokenizer.from_pretrained(config.base_model_name_or_path)
model = PeftModel.from_pretrained(model, llm_model)

pipe = pipeline("conversational", model=model, tokenizer=tokenizer)

messages = [
    {
        "role": "system",
        "content": "Você é um chatbot amigável que sempre responde em português",
    },
    {"role": "user", "content": "O que é um bode?"},
]

result = pipe(messages)
print(result.messages[-1]['content'])

E sobre o template, se a gente rodar:

print(tokenizer.default_chat_template)

volta isso:

{% if messages[0]['role'] == 'system' %}{% set loop_messages = messages[1:] %}{% set system_message = messages[0]['content'] %}{% elif false == true and not '<<SYS>>' in messages[0]['content'] %}{% set loop_messages = messages %}{% set system_message = 'You are a helpful, respectful and honest assistant. Always answer as helpfully as possible, while being safe. Your answers should not include any harmful, unethical, racist, sexist, toxic, dangerous, or illegal content. Please ensure that your responses are socially unbiased and positive in nature.\n\nIf a question does not make any sense, or is not factually coherent, explain why instead of answering something not correct. If you don\'t know the answer to a question, please don\'t share false information.' %}{% else %}{% set loop_messages = messages %}{% set system_message = false %}{% endif %}{% for message in loop_messages %}{% if (message['role'] == 'user') != (loop.index0 % 2 == 0) %}{{ raise_exception('Conversation roles must alternate user/assistant/user/assistant/...') }}{% endif %}{% if loop.index0 == 0 and system_message != false %}{% set content = '<<SYS>>\n' + system_message + '\n<</SYS>>\n\n' + message['content'] %}{% else %}{% set content = message['content'] %}{% endif %}{% if message['role'] == 'user' %}{{ bos_token + '[INST] ' + content.strip() + ' [/INST]' }}{% elif message['role'] == 'system' %}{{ '<<SYS>>\n' + content.strip() + '\n<</SYS>>\n\n' }}{% elif message['role'] == 'assistant' %}{{ ' '  + content.strip() + ' ' + eos_token }}{% endif %}{% endfor %}

Fico pensando que seria até uma boa, se possível é claro, atualizar esse chat template no tokenize de vocês na próxima atualização, traduzindo essas partes em inglês

Recogna NLP org

Olá @celsowm , tudo bem?

Agradecemos pela sua participação e ficamos contentes com o seu envolvimento. Optamos por incorporar o código de exemplo com base no Alpaca, acreditando que isso facilitaria a compreensão para usuários familiarizados com o Alpaca/LLM. Contudo, sua sugestão é extremamente valiosa, e apreciamos seu feedback. Na versão inicial, nosso foco foi disponibilizar o modelo para a comunidade de Processamento de Linguagem Natural (NLP), uma vez que encontrar um modelo puramente em português e gratuito não era uma tarefa simples. No entanto, estamos empenhados em aprimorar o Bode em futuras versões, levando em consideração os detalhes que você destacou.

Agradecemos novamente pela sua colaboração. Esperamos que o Bode seja útil em suas pesquisas ou trabalhos. Fique atento, pois em breve lançaremos novas versões do Bode!

Atenciosamente,

Recogna NLP.

Sign up or log in to comment