|
--- |
|
license: apache-2.0 |
|
datasets: |
|
- teknium/OpenHermes-2.5 |
|
language: |
|
- en |
|
--- |
|
## Training |
|
- 8x A6000s |
|
- [Forked version of unsloth](https://github.com/serp-ai/unsloth) for efficient training |
|
- Sequence Length: 4096 |
|
- Effective batch size: 128 |
|
- Learning Rate: 2e-5 with linear decay |
|
- Epochs: 1 |
|
- [Base model](https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.2) trained with QLoRA (rank 64, alpha 16) and MoE adapters/routers trained in bf16 |
|
- Num Experts: 16 |
|
- Top K: 4 |
|
|
|
## Prompt Format |
|
``` |
|
<|im_start|>system\n{message}<|im_end|>\n<|im_start|>user\n{message}<|im_end|>\n<|im_start|>assistant\n |
|
``` |
|
|
|
## Usage |
|
```python |
|
from transformers import AutoModelForCausalLM, AutoTokenizer |
|
|
|
tokenizer = AutoTokenizer.from_pretrained("serpdotai/sparsetral-16x7B-v2", trust_remote_code=True) |
|
model = AutoModelForCausalLM.from_pretrained("serpdotai/sparsetral-16x7B-v2", device_map="auto", trust_remote_code=True).eval() |
|
|
|
system_str = "<|im_start|>system\n{message}<|im_end|>\n" |
|
user_str = "<|im_start|>user\n{message}<|im_end|>\n" |
|
assistant_str = "<|im_start|>assistant\n{message}<|im_end|>\n" |
|
|
|
def construct_prompt(messages): |
|
prompt = "" |
|
for message in messages: |
|
if message["from"] in ["human", "user"]: |
|
prompt += user_str.format( |
|
message=message["value"] |
|
) |
|
elif message["from"] in ["gpt", "assistant"]: |
|
prompt += assistant_str.format( |
|
message=message["value"] |
|
) |
|
elif message["from"] in ["system", "instruction"]: |
|
prompt += system_str.format( |
|
message=message["value"] |
|
) |
|
else: |
|
raise ValueError( |
|
f"Unknown message type: {message['from']}" |
|
) |
|
return prompt + "<|im_start|>assistant\n" |
|
|
|
system = "You are a helpful assistant who will help the user to the best of their ability. If you don't know something, say \"I don't know\"" |
|
user = "Are you sentient?" |
|
|
|
messages = [ |
|
{"from": "system", "value": system}, |
|
{"from": "user", "value": user}, |
|
] |
|
|
|
prompt = construct_prompt(messages) |
|
inputs = tokenizer(prompt, return_tensors="pt") |
|
inputs = inputs.to(model.device) |
|
pred = model.generate(**inputs, max_length=4096, do_sample=True, top_k=50, top_p=0.99, temperature=0.9, num_return_sequences=1) |
|
print(tokenizer.decode(pred.cpu()[0], skip_special_tokens=True)) |
|
``` |
|
|
|
## Other Information |
|
Paper reference: [Parameter-Efficient Sparsity Crafting from Dense to Mixture-of-Experts for Instruction Tuning on General Tasks](https://arxiv.org/abs/2401.02731) |
|
|
|
[Original Paper repo](https://github.com/wuhy68/Parameter-Efficient-MoE) |
|
|
|
[Forked repo with mistral support (sparsetral)](https://github.com/serp-ai/Parameter-Efficient-MoE) |
|
|
|
If you are interested in faster inferencing, check out our [fork of vLLM](https://github.com/serp-ai/vllm) that adds sparsetral support |