Views
No views yet
1// Define a Node of the LinkedList
2pub struct Node<T> {
3 data: T,
4 next: Option<Box<Node<T>>>,
5}
6
7// Define the LinkedList
8pub struct LinkedList<T> {
9 head: Option<Box<Node<T>>>,
10 size: usize,
11}
12
13// Implement LinkedList methods
14impl<T> LinkedList<T> {
15pub fn new() -> Self {
16LinkedList { head: None, size: 0 }
17}
18
19pub fn push(&mut self, data: T) {
20 let new_node = Box::new(Node { data, next: self.head.take() });
21 self.head = Some(new_node);
22 self.size += 1;
23}
24
25pub fn pop(&mut self) -> Option<T> {
26 let node = self.head.take()?;
27 self.head = node.next;
28 self.size -= 1;
29Some(node.data)
30}
31
32pub fn len(&self) -> usize {
33 self.size
34}
35
36pub fn is_empty(&self) -> bool {
37 self.size == 0
38}
39
40}Node struct and a LinkedList struct. The Node struct contains some generic data of type T and a pointer to the next Node. The LinkedList struct contains a pointer to the head of the LinkedList and a size variable to keep track of the current size of the list. \n\nThe methods of the LinkedList are implemented to perform basic linked list operations like push, pop, len, and is_empty. The push method adds a new node to the front of the list, pop removes the node from the front of the list, len returns the size of the list and is_empty checks if the list is empty.sudo apt-get update -y \
&& sudo apt-get install -y --no-install-recommends \
aws-neuronx-dkms=2.15.9.0 \
aws-neuronx-collectives=2.19.7.0-530fb3064 \
aws-neuronx-runtime-lib=2.19.5.0-97e2d271b \
aws-neuronx-tools=2.16.1.0
pip3 install --upgrade \
neuronx-cc==2.12.54.0 \
torch-neuronx==1.13.1.1.13.0 \
transformers-neuronx==0.9.474 \
--extra-index-url=https://pip.repos.neuron.amazonaws.comgit lfs clone https://huggingface.co/VishaalY/Phind-CodeLlama-34B-v2-neuron-seqlen-2048-bs-1

import torch
from transformers_neuronx.module import save_pretrained_split
from transformers import LlamaForCausalLM
from transformers_neuronx.config import NeuronConfig
from transformers_neuronx import constants
import time
from transformers import AutoTokenizer
from transformers_neuronx.llama.model import LlamaForSampling
import os
print("Construct a tokenizer and encode prompt text.")
tokenizer = AutoTokenizer.from_pretrained('./Phind-CodeLlama-34B-v2')
prompt = "How do I reverse a linked list?"
input_ids = tokenizer.encode(prompt, return_tensors="pt")
print("Load from Neuron Artifacts")
neuron_model = LlamaForSampling.from_pretrained('./phind-34b-split', batch_size=1, tp_degree=24, amp='f16')
neuron_model.load('neuron_artifacts') # Load the compiled Neuron artifacts
neuron_model.to_neuron() # will skip compile
# ---------------------------------------------------------------------------------------------------------------
print("Run Inference.")
with torch.inference_mode():
start = time.time()
generated_sequences = neuron_model.sample(input_ids, sequence_length=2048, top_k=50)
elapsed = time.time() - start
# ---------------------------------------------------------------------------------------------------------------
generated_sequences = [tokenizer.decode(seq) for seq in generated_sequences]
print(f'generated sequences {generated_sequences} in {elapsed} seconds')import torch
from transformers_neuronx.module import save_pretrained_split
from transformers import LlamaForCausalLM
from transformers_neuronx.config import NeuronConfig
from transformers_neuronx import constants
import time
from transformers import AutoTokenizer
from transformers_neuronx.llama.model import LlamaForSampling
import os
# ---------------------------------------------------------------------------------------------------------------
print("Loading Model from HuggingFace. Converting to single bin / safetensor file for neuronx.")
model = LlamaForCausalLM.from_pretrained('Phind/Phind-CodeLlama-34B-v2')
save_pretrained_split(model, './phind-34b-split')
# Compiler flag -O1 is a workaround for “Too many instructions after unroll” in SDK 2.14
os.environ['NEURON_CC_FLAGS'] = '-O1'
# ---------------------------------------------------------------------------------------------------------------
print("Loading Model from single bin / safetensor. Convert to .neff format.")
neuron_model = LlamaForSampling.from_pretrained('./phind-34b-split', batch_size=1, tp_degree=24, amp='f16')
neuron_model.to_neuron()
# # ---------------------------------------------------------------------------------------------------------------
print("construct a tokenizer and encode prompt text")
tokenizer = AutoTokenizer.from_pretrained('./Phind-CodeLlama-34B-v2')
prompt = "How do I reverse a linked list?"
input_ids = tokenizer.encode(prompt, return_tensors="pt")
# # ---------------------------------------------------------------------------------------------------------------
print("run inference with top-k sampling")
with torch.inference_mode():
start = time.time()
generated_sequences = neuron_model.sample(input_ids, sequence_length=2048, top_k=50)
elapsed = time.time() - start
generated_sequences = [tokenizer.decode(seq) for seq in generated_sequences]
print(f'generated sequences {generated_sequences} in {elapsed} seconds')
# ---------------------------------------------------------------------------------------------------------------
print("Saving Neuron Artifacts as .neff files.")
neuron_model.save('./neuron_artifacts') # can be copied and used on a different neuron instance
del neuron_model