--- license: other language: - en library_name: transformers tags: - RLHF - Nexusflow - Athene - Reward Model --- # Llama3-Athene-RM-70B We introduce Llama3-Athene-RM-70B, an open-weights reward model based off Llama-3-70B-Instruct. - **Developed by:** The Nexusflow Team (Evan Frick\*, Peter Jin\*, Tianle Li\*, Karthik Ganesan, Jian Zhang, Jiantao Jiao and Banghua Zhu). - **Model type:** Reward Model - **Finetuned from model:** [Llama-3-70B-Instruct](https://huggingface.co/meta-llama/Meta-Llama-3-70B-Instruct). - **License**: [Nexusflow Research License](https://huggingface.co/Nexusflow/Athene-RM-70B/blob/main/Nexusflow_Research_License.pdf) - **Blog**: https://nexusflow.ai/blogs/athene ### Usage ```python from transformers import LlamaModel, LlamaPreTrainedModel, TextClassificationPipeline from torch import nn import torch from typing import Dict class AtheneForSequenceClassification(LlamaPreTrainedModel): def __init__(self, config): super().__init__(config) self.model = LlamaModel(config) self.v_head = nn.Linear(config.hidden_size, 1, bias=False) self.CLS_ID = 128003 # Initialize weights and apply final processing self.post_init() def get_device(self): return self.model.device def forward( self, input_ids=None, past_key_values=None, attention_mask=None, position_ids=None, ): transformer_outputs = self.model( input_ids, attention_mask=attention_mask, position_ids=position_ids, output_hidden_states=True, ) hidden_states = transformer_outputs.hidden_states[-1] scores = [] rewards = self.v_head(hidden_states).squeeze(-1) bs = int(input_ids.shape[0]) for i in range(bs): c_inds = (input_ids[i] == self.CLS_ID).nonzero() c_ind = c_inds[-1].item() scores.append(rewards[i, c_ind]) scores = torch.stack(scores) return {"scores": scores} # Make a pipeline to handle pre and post-processing class AtheneRewardPipeline(TextClassificationPipeline): def preprocess(self, inputs, **tokenizer_kwargs) -> Dict[str, torch.Tensor]: return_tensors = self.framework formatted = self.tokenizer.apply_chat_template(inputs, tokenize=False) formatted = formatted + self.tokenizer.cls_token return self.tokenizer( formatted, return_tensors=return_tensors, max_length=4096, padding="longest", truncation=True, ) def postprocess(self, model_outputs, function_to_apply=None, top_k=1, _legacy=True): return model_outputs["scores"].cpu().float().item() # Initialize the model model = AtheneForSequenceClassification.from_pretrained("Nexusflow/Athene-RM-70B", torch_dtype=bfloat16) tokenizer = AutoTokenizer.from_pretrained("Nexusflow/Athene-RM-70B") # Initialize the pipeline pipe = pipeline( task="text-classification", model=self.model, tokenizer=self.tokenizer, pipeline_class=AtheneRewardPipeline, device_map="auto", ) messages = [ { "role": 'user', "content": "What is an Athene Noctura? Explain one sentence." }, { "role": "assistant", "content": "The Athene noctua, also known as the little owl, is a small, nocturnal owl species native to Europe, Asia, and North Africa, characterized by its distinctive facial disk and piercing yellow eyes." } ] print(pipe([messages])) # Print the reward! ``` ### Citation ``` @misc{Athene2024, title = {Athene-70B: Redefining the Boundaries of Post-Training for Open Models}, url = {https://nexusflow.ai/blogs/athene}, author = {Frick, Evan and Jin, Peter and Li, Tianle and Ganesan, Karthik and Zhang, Jian and Jiao, Jiantao and Zhu, Banghua}, month = {July}, year = {2024} } ```