File size: 8,735 Bytes
04dc1b0
dd9460b
 
 
 
 
04dc1b0
 
 
 
 
dd9460b
04dc1b0
 
dd9460b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
04dc1b0
dd9460b
04dc1b0
a687e5c
04dc1b0
a687e5c
04dc1b0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
dd9460b
04dc1b0
 
 
 
 
0fd11b5
 
 
 
 
 
04dc1b0
 
 
dd9460b
04dc1b0
 
 
 
 
 
 
 
 
 
 
 
 
 
dd9460b
04dc1b0
 
dd9460b
 
04dc1b0
 
dd9460b
04dc1b0
 
 
 
 
 
 
 
 
 
 
 
 
 
dd9460b
 
 
eef9145
04dc1b0
 
 
 
 
 
 
 
 
 
 
 
 
 
dd9460b
04dc1b0
 
 
 
dd9460b
04dc1b0
 
 
 
 
 
 
 
 
dd9460b
 
04dc1b0
dd9460b
04dc1b0
dd9460b
 
04dc1b0
 
 
 
 
 
 
dd9460b
04dc1b0
 
 
 
dd9460b
04dc1b0
 
 
 
 
 
 
dd9460b
04dc1b0
 
 
 
 
dd9460b
04dc1b0
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
---
base_model: HuggingFaceH4/zephyr-7b-beta
datasets:
- HuggingFaceH4/ultrachat_200k
- HuggingFaceH4/ultrafeedback_binarized
license: mit
language:
  - en
pipeline_tag: text-generation
inference: false
tags:
  - generated_from_trainer
  - inferentia2
  - neuron
model-index:
- name: zephyr-7b-beta
  results: []
model_creator: Hugging Face H4
model_name: Zephyr 7B Beta
model_type: mistral
prompt_template: '<|system|>

  </s>

  <|user|>

  {prompt}</s>

  <|assistant|>

  '
---
# Neuronx model for Zephyr-7b-beta

This repository contains [AWS Inferentia2](https://aws.amazon.com/ec2/instance-types/inf2/) and [neuronx](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/) compatible checkpoints for [HuggingFaceH4/zephyr-7b-beta](https://huggingface.co/HuggingFaceH4/zephyr-7b-beta). 

However, this file includes an example of how to compile various versions of Zephyr.  Support isn’t available yet (as of 1/9/2024) in the [optimum neuron](https://huggingface.co/docs/optimum-neuron/index) framework, so we use the base transformers library.

These instructions closely follow the [Developer Guide](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/libraries/transformers-neuronx/transformers-neuronx-developer-guide.html#grouped-query-attention-gqa-support-beta).  Look there for more detailed explanations, especially for the GQA settings.

This model has been compiled to run on an inf2.xlarge (the smallest Inferentia2 instance).  You can run it on a bigger instance, but it will only use two cores no matter how many are available, unless you change the core number available in compilation.  Remember that each Neuron processor has two cores.


## Set up the environment

First, use the [DLAMI image from Hugging Face](https://aws.amazon.com/marketplace/pp/prodview-gr3e6yiscria2).  It has most of the utilities and drivers preinstalled.  However, you will need to update transformers-neruonx from the source to get Mistral support.


```
python -m pip install git+https://github.com/aws-neuron/transformers-neuronx.git
```

## Running inference from this repository

If you want to run a quick test or if the exact model you want to use is [HuggingFaceH4/zephyr-7b-beta](https://huggingface.co/HuggingFaceH4/zephyr-7b-beta), you can run it directly using the steps below.  Otherwise, jump to the Compilation of other Mistral versions section.

First, you will need a local copy of the library.  This is because one of the nice things that the Hugging Face optimum library does is abstract local loads from repository loads.  However, Mistral inference isn't supported yet.


```
# To speed up downloads we can use hf_transfer
pip install hf_transfer
HF_HUB_ENABLE_HF_TRANSFER=1

# use huggingface-cli to download model to local dir
huggingface-cli download ritikk/zephyr-7b-beta-neuron --local-dir zephyr-7b-beta-neuron

```

This should put a local copy in zephyr-7b-beta-neuron.  This process should take a 5-10 minutes.  If it completes in a few seconds the first time you run it, you are likely having problems with git-lfs.  You can see this by using ls -al to check the size of the files downloaded.  You will also notice it later when you get parsing errors.

Next, load the model and neff files from disk into the Neuron processors:

```
import torch
from transformers_neuronx import constants
from transformers_neuronx.mistral.model import MistralForSampling
from transformers_neuronx.config import NeuronConfig
from transformers import AutoModelForCausalLM, AutoTokenizer

# Set sharding strategy for GQA to be shard over heads
neuron_config = NeuronConfig(
    grouped_query_attention=constants.GQA.SHARD_OVER_HEADS
)

# define the model.  These are the settings used in compilation.
# If you want to change these settings, skip to "Compilation of other Mistral versions"
model_neuron = MistralForSampling.from_pretrained("zephyr-7b-beta-neuron", batch_size=1, \
    tp_degree=2, n_positions=256, amp='bf16', neuron_config=neuron_config)

# load the neff files from the local directory instead of compiling
model_neuron.load("zephyr-7b-beta-neuron")

# load the neff files into the neuron processors.  
# you can see this process happening if you run neuron-top from the command line in another console.
# if you didn't do the previous load command, this will also compile the neff files
model_neuron.to_neuron()

```

## Inference example

This points to the original model for the tokenizer because the tokenizer is the same.  
If you are compiling your own and want to have a single reference for everything, you can copy the special_tokens_map.json and tokenizer* from the original model to your local copy.

```
# Get a tokenizer and example input. This points to original tokenizer. 
# tokenizer = AutoTokenizer.from_pretrained("HuggingFaceH4/zephyr-7b-alpha")
# this refers to tokenizer from local copy
tokenizer = AutoTokenizer.from_pretrained("zephyr-7b-beta-neuron")
text = "[INST] What is your favourite condiment? [/INST]"
encoded_input = tokenizer(text, return_tensors='pt')

# Run inference
with torch.inference_mode():
    generated_sequence = model_neuron.sample(encoded_input.input_ids, sequence_length=256, start_ids=None)
    print([tokenizer.decode(tok) for tok in generated_sequence])

```


Example output:

```
["<s> [INST] What is your favourite condiment? [/INST]\nHere's a little script to test people's favorite condiment.\n\nYou can do this with paper cones and have people guess what's in it, but they need to write their guess on a piece of of paper and put it in a jar before they take a bite.\n\nIn this version, we have ketchup, mustard,mayonnaise,bbq sauce, and relish.\n\nThe script is straightforward, so as long as your bottle isn’t too tiny, you can add to the bottom of the script,or re-shape the form of the script a bit.\n\nIf you put their guesses in a jar before they take a bite,you can put all their guesses in the jar as soon as they're done,and show the container as they guess.\nAs for removing lines from the script,you'll probably be removing the ones from the bottom of the script,or adding lines to the top of of the script.\nIf for no matter reason your bottle is too tiny to set all the guesses in,you can write their guesses on cards or bits of paper,and set"]
```

## Compilation of other Mistral versions

If you want to use a different version of Mistral or Zephyr from Hugging Face, use the slightly modified code below.  It essentially removes the “load” command.  When the “to_neuron()” command sees that the model object doesn’t include the neff files, it will kick off the recompile.  You can save them at the end so you only have to do the compilation process once.  After that, you can use the code above to load a model and the neff files from the local directory.

```
import torch
from transformers_neuronx import constants
from transformers_neuronx.mistral.model import MistralForSampling
from transformers_neuronx.module import save_pretrained_split
from transformers_neuronx.config import NeuronConfig
from transformers import AutoModelForCausalLM, AutoTokenizer

model_id="HuggingFaceH4/zephyr-7b-beta"

# Load and save the CPU model with bfloat16 casting.  This also gives us a local copy
# change the Hugging Face model name (HuggingFaceH4/zephyr-7b-beta) below to what you want
# You can update the other model names if you want, but they just reference a directory on the local disk.
model_cpu = AutoModelForCausalLM.from_pretrained(model_id)
save_pretrained_split(model_cpu, model_id)

# Set sharding strategy for GQA to be shard over heads
neuron_config = NeuronConfig(
    grouped_query_attention=constants.GQA.SHARD_OVER_HEADS
)

# Create and compile the Neuron model
model_neuron = MistralForSampling.from_pretrained(model_id, batch_size=1, \
    tp_degree=2, n_positions=256, amp='bf16', neuron_config=neuron_config)
model_neuron.to_neuron()

#save compiled neff files out to the same directory
model_neuron.save("HuggingFaceH4/zephyr-7b-beta")

```



## Arguments passed during compilation

The settings use in compilation are the same as shown above in the code.  If you want to change these, you will need to recompile.  If you don’t want to pass them in each time, you could update the config.json file.  This is another nice thing the Hugging Face optimum neuron framework does for us.  You can see an example of the format by looking at one of the Llama model config.json files.  For [example](https://huggingface.co/aws-neuron/Llama-2-7b-hf-neuron-latency/blob/main/config.json).

```
neuron_config = NeuronConfig(
    grouped_query_attention=constants.GQA.SHARD_OVER_HEADS
)
("zephyr-7b-beta-neuron", batch_size=1, tp_degree=2, n_positions=256, amp='bf16', neuron_config=neuron_config)

```