Mixtral-8x7B MoE
Para mim, a melhor descrição do mixtral-8x7b
é a seguinte imagem
Entre o lançamento do gemini
e o lançamento do mixtra-8x7b
, houve uma diferença de apenas alguns dias. Nos dois primeiros dias após o lançamento do gemini
houve muita conversa sobre esse modelo, mas assim que o mixtral-8x7b
foi lançado, o gemini
foi completamente esquecido e toda a comunidade estava falando sobre o mixtral-8x7b
.
E não é de se admirar que, analisando seus benchmarks, podemos ver que ele está no nível de modelos como o llama2-70B
e o GPT3.5
, mas com a diferença de que, enquanto o mixtral-8x7b
tem apenas 46,7B de parâmetros, o llama2-70B
tem 70B e o GPT3.5
tem 175B.
Este caderno foi traduzido automaticamente para torná-lo acessível a mais pessoas, por favor me avise se você vir algum erro de digitação..
Número de parâmetros
Como o nome sugere, mixtral-8x7b
é um conjunto de 8 modelos de parâmetros 7B, portanto, poderíamos pensar que ele tem 56B parâmetros (7Bx8), mas não tem. Como [Andrej Karpathy] (https://twitter.com/karpathy/status/1734251375163511203) explica, somente os blocos Feed forward
dos transformadores são multiplicados por 8, o restante dos parâmetros é compartilhado entre os 8 modelos. Portanto, no final, o modelo tem 46,7 bilhões de parâmetros.
Mistura de especialistas (MoE)
Conforme mencionado, o modelo é um conjunto de 8 modelos 7B de parâmetros, daí a sigla MoE
, que significa Mixture of Experts
. Cada um dos 8 modelos é treinado de forma independente, mas quando a inferência é feita, um roteador decide a saída de qual modelo deve ser usado.
A imagem a seguir mostra a arquitetura de um Transformer
.
Se você não sabe, o importante é que essa arquitetura consiste em um codificador e um decodificador.
Os LLMs são modelos somente de decodificador, portanto, não têm um codificador. Você pode ver que na arquitetura há três módulos de atenção, um deles realmente conecta o codificador ao decodificador. Mas como os LLMs não têm um codificador, não há necessidade do módulo de atenção que conecta o decodificador e o decodificador.
Agora que sabemos como é a arquitetura de um LLM, podemos ver como é a arquitetura do mixtral-8x7b
. Na imagem a seguir, podemos ver a arquitetura do modelo
Arquitetura do MoE] (https://pub-fb664c455eca46a2ba762a065ac900f7.r2.dev/MoE_architecture.webp)
Como você pode ver, a arquitetura consiste em um decodificador Transformer
de 7B parâmetros, sendo que apenas a camada Feed forward
consiste em 8 camadas Feed forward
com um roteador que escolhe qual das 8 camadas Feed forward
deve ser usada. Na imagem acima, são mostradas apenas quatro camadas Feed forward
, o que deve ter sido feito para simplificar o diagrama, mas, na realidade, existem 8 camadas Feed forward
. Você também pode ver dois caminhos para duas palavras diferentes, a palavra More
e a palavra Parameters
e como o roteador escolhe qual Feed forward
usar para cada palavra.
Observando a arquitetura, podemos entender por que o modelo tem 46,7 bilhões de parâmetros e não 56 bilhões. Como dissemos, apenas os blocos Feed forward
são multiplicados por 8, o restante dos parâmetros é compartilhado entre os 8 modelos.
Usando o Mixtral-8x7b na nuvem
Infelizmente, usar o mixtral-8x7b
localmente é complicado, pois os requisitos de hardware são os seguintes
- float32: VRAM > 180 GB, ou seja, como cada parâmetro ocupa 4 bytes, precisamos de 46,7B * 4 = 186,8 GB de VRAM apenas para armazenar o modelo, mais a VRAM necessária para armazenar os dados de entrada e saída.
- float16: VRAM > 90 GB, nesse caso, cada parâmetro ocupa 2 bytes, portanto, precisamos de 46,7B * 2 = 93,4 GB de VRAM apenas para armazenar o modelo, além da VRAM necessária para armazenar os dados de entrada e saída.
- 8 bits: VRAM > 45 GB, aqui cada parâmetro ocupa 1 byte, portanto, precisamos de 46,7B * 1 = 46,7 GB de VRAM apenas para armazenar o modelo, além da VRAM necessária para armazenar os dados de entrada e saída.
- 4 bits: VRAM > 23 GB, aqui cada parâmetro ocupa 0,5 bytes, portanto, precisamos de 46,7B * 0,5 = 23,35 GB de VRAM apenas para armazenar o modelo, além da VRAM necessária para armazenar os dados de entrada e saída.
Precisamos de GPUs muito potentes para executá-lo, mesmo quando usamos o modelo quantizado de 4 bits.
Portanto, a maneira mais fácil de usar o Mixtral-8x7B
é usá-lo já implantado na nuvem. Encontrei vários locais onde você pode usá-lo
Uso do Mixtral-8x7b no bate-papo huggingface
O primeiro está no [huggingface chat] (https://huggingface.co/chat). Para usá-lo, clique na roda dentada dentro da caixa Current Model
e selecione Mistral AI - Mixtral-8x7B
. Uma vez selecionado, você pode começar a conversar com o modelo.
Uma vez lá dentro, selecione mistralai/Mixtral-8x7B-Instruct-v0.1
e, por fim, clique no botão Activate
. Agora podemos testar o modelo
Como você pode ver, perguntei a ele em espanhol o que é "MoE" e ele me explicou.
Usando o Mixtral-8x7b no Perplexity Labs
Outra opção é usar o [Perplexity Labs] (https://labs.perplexity.ai/). Uma vez lá dentro, selecione mixtral-8x7b-instruct
em um menu suspenso no canto inferior direito.
Como você pode ver, eu também perguntei a ele em espanhol o que é MoE
e ele me explicou.
Usando o Mixtral-8x7b localmente por meio da API huggingface
Uma maneira de usá-lo localmente, independentemente dos recursos de HW que você tenha, é por meio da API huggingface. Para fazer isso, você precisa instalar a biblioteca huggingface huggingface-hub
.
%pip install huggingface-hub
Aqui está uma implementação com o gradio
.
%pip install huggingface-hubfrom huggingface_hub import InferenceClientimport gradio as grclient = InferenceClient("mistralai/Mixtral-8x7B-Instruct-v0.1")def format_prompt(message, history):prompt = "<s>"for user_prompt, bot_response in history:prompt += f"[INST] {user_prompt} [/INST]"prompt += f" {bot_response}</s> "prompt += f"[INST] {message} [/INST]"return promptdef generate(prompt, history, system_prompt, temperature=0.9, max_new_tokens=256, top_p=0.95, repetition_penalty=1.0,):temperature = float(temperature)if temperature < 1e-2:temperature = 1e-2top_p = float(top_p)generate_kwargs = dict(temperature=temperature, max_new_tokens=max_new_tokens, top_p=top_p, repetition_penalty=repetition_penalty, do_sample=True, seed=42,)formatted_prompt = format_prompt(f"{system_prompt}, {prompt}", history)stream = client.text_generation(formatted_prompt, **generate_kwargs, stream=True, details=True, return_full_text=False)output = ""for response in stream:output += response.token.textyield outputreturn outputadditional_inputs=[gr.Textbox(label="System Prompt", max_lines=1, interactive=True,),gr.Slider(label="Temperature", value=0.9, minimum=0.0, maximum=1.0, step=0.05, interactive=True, info="Higher values produce more diverse outputs"),gr.Slider(label="Max new tokens", value=256, minimum=0, maximum=1048, step=64, interactive=True, info="The maximum numbers of new tokens"),gr.Slider(label="Top-p (nucleus sampling)", value=0.90, minimum=0.0, maximum=1, step=0.05, interactive=True, info="Higher values sample more low-probability tokens"),gr.Slider(label="Repetition penalty", value=1.2, minimum=1.0, maximum=2.0, step=0.05, interactive=True, info="Penalize repeated tokens")]gr.ChatInterface(fn=generate,chatbot=gr.Chatbot(show_label=False, show_share_button=False, show_copy_button=True, likeable=True, layout="panel"),additional_inputs=additional_inputs,title="Mixtral 46.7B",concurrency_limit=20,).launch(show_api=False)
Mixtral-8x7B huggingface API](https://pub-fb664c455eca46a2ba762a065ac900f7.r2.dev/Mixtral-8x7B_huggingface_API.webp)