Views
No views yet

| Property | Value |
|---|---|
| Parameters | 354,483,968 |
| Layers | 16 (10 conv + 6 attn) |
| Context length | 32,768 tokens |
| Vocabulary size | 65,536 |
| Precision | bfloat16 |
| Training budget | 10 trillion tokens |
| License | LFM Open License v1.0 |
temperature=0.3min_p=0.15repetition_penalty=1.05npm i @huggingface/transformers1import { pipeline, TextStreamer } from "@huggingface/transformers";
2// Create a text generation pipeline
3const generator = await pipeline(
4 "text-generation",
5 "onnx-community/LFM2-350M-ONNX",
6 { dtype: "q4" },
7);
8// Define the list of messages
9const messages = [
10 { role: "system", content: "You are a helpful assistant." },
11 { role: "user", content: "What is the capital of France?" },
12];
13// Generate a response
14const output = await generator(messages, {
15 max_new_tokens: 512,
16 do_sample: false,
17 streamer: new TextStreamer(generator.tokenizer, { skip_prompt: true, skip_special_tokens: true }),
18});
19console.log(output[0].generated_text.at(-1).content);
20// The capital of France is Paris.1import { AutoModelForCausalLM, AutoTokenizer, TextStreamer } from "@huggingface/transformers";
2// Load tokenizer and model
3const model_id = "onnx-community/LFM2-350M-ONNX";
4const tokenizer = await AutoTokenizer.from_pretrained(model_id);
5const model = await AutoModelForCausalLM.from_pretrained(
6 model_id, { dtype: "q4", device: "webgpu" },
7);
8// Define tools and messages
9const tools = [
10 {
11 name: "get_weather",
12 description: "Get current weather information for a location",
13 parameters: {
14 type: "object",
15 properties: {
16 location: {
17 type: "string",
18 description: "The city and state, e.g. San Francisco, CA",
19 },
20 unit: {
21 type: "string",
22 enum: ["celsius", "fahrenheit"],
23 description: "The unit of temperature to use",
24 },
25 },
26 required: ["location"],
27 },
28 },
29];
30const messages = [
31 {
32 role: "user",
33 content: "What's the weather like in New York?"
34 },
35];
36// Prepare inputs
37const input = tokenizer.apply_chat_template(messages, {
38 tools,
39 add_generation_prompt: true,
40 return_dict: true,
41});
42// Generate output
43const sequences = await model.generate({
44 ...input,
45 max_new_tokens: 512,
46 do_sample: false,
47 streamer: new TextStreamer(tokenizer, { skip_prompt: true, skip_special_tokens: false }),
48});
49// Decode and print the generated text
50const response = tokenizer.batch_decode(
51 sequences.slice(null, [input.input_ids.dims[1], null]),
52 { skip_special_tokens: true },
53);
54console.log(response[0]); // [get_weather(location="New York", unit="fahrenheit")]1from transformers import AutoConfig, AutoTokenizer
2import onnxruntime
3import numpy as np
4from huggingface_hub import hf_hub_download
5# 1. Load config, processor, and model
6model_id = "onnx-community/LFM2-350M-ONNX"
7config = AutoConfig.from_pretrained(model_id)
8tokenizer = AutoTokenizer.from_pretrained(model_id)
9filename = "model.onnx" # Options: "model.onnx", "model_fp16.onnx", "model_q4.onnx", "model_q4f16.onnx"
10model_path = hf_hub_download(repo_id=model_id, filename=f"onnx/{filename}") # Download the graph
11hf_hub_download(repo_id=model_id, filename=f"onnx/{filename}_data") # Download the weights
12session = onnxruntime.InferenceSession(model_path)
13## Set config values
14num_key_value_heads = config.num_key_value_heads
15head_dim = config.hidden_size // config.num_attention_heads
16num_hidden_layers = config.num_hidden_layers
17eos_token_id = config.eos_token_id
18hidden_size = config.hidden_size
19conv_L_cache = config.conv_L_cache
20layer_types = config.layer_types
21# 2. Prepare inputs
22prompt = "What is C. elegans?"
23messages = [{"role": "user", "content": prompt}]
24inputs = tokenizer.apply_chat_template(messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="np")
25input_ids = inputs['input_ids']
26attention_mask = inputs['attention_mask']
27batch_size = input_ids.shape[0]
28position_ids = np.tile(np.arange(0, input_ids.shape[-1]), (batch_size, 1))
29past_cache_values = {}
30for i in range(num_hidden_layers):
31 if layer_types[i] == 'full_attention':
32 for kv in ('key', 'value'):
33 past_cache_values[f'past_key_values.{i}.{kv}'] = np.zeros([batch_size, num_key_value_heads, 0, head_dim], dtype=np.float32)
34 elif layer_types[i] == 'conv':
35 past_cache_values[f'past_conv.{i}'] = np.zeros([batch_size, hidden_size, conv_L_cache], dtype=np.float32)
36 else:
37 raise ValueError(f"Unsupported layer type: {layer_types[i]}")
38# 3. Generation loop
39max_new_tokens = 1024
40generated_tokens = np.array([[]], dtype=np.int64)
41for i in range(max_new_tokens):
42 logits, *present_cache_values = session.run(None, dict(
43 input_ids=input_ids,
44 attention_mask=attention_mask,
45 position_ids=position_ids,
46 **past_cache_values,
47 ))
48 ## Update values for next generation loop
49 input_ids = logits[:, -1].argmax(-1, keepdims=True)
50 attention_mask = np.concatenate([attention_mask, np.ones_like(input_ids, dtype=np.int64)], axis=-1)
51 position_ids = position_ids[:, -1:] + 1
52 for j, key in enumerate(past_cache_values):
53 past_cache_values[key] = present_cache_values[j]
54 generated_tokens = np.concatenate([generated_tokens, input_ids], axis=-1)
55 if (input_ids == eos_token_id).all():
56 break
57 ## (Optional) Streaming
58 print(tokenizer.decode(input_ids[0]), end='', flush=True)
59print()
60# 4. Output result
61print(tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)[0])