Views
No views yet

| Property | Value |
|---|---|
| Parameters | 1,170,340,608 |
| 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
3// Create a text generation pipeline
4const generator = await pipeline(
5 "text-generation",
6 "onnx-community/LFM2-1.2B-ONNX",
7 { dtype: "q4", device: "webgpu" },
8);
9
10// Define the list of messages
11const messages = [
12 { role: "system", content: "You are a helpful assistant." },
13 { role: "user", content: "What is the capital of France?" },
14];
15
16// Generate a response
17const output = await generator(messages, {
18 max_new_tokens: 512,
19 do_sample: false,
20 streamer: new TextStreamer(generator.tokenizer, { skip_prompt: true, skip_special_tokens: true }),
21});
22console.log(output[0].generated_text.at(-1).content);
23// The capital of France is Paris.1import { pipeline, TextStreamer } from "@huggingface/transformers";
2
3// Create a text generation pipeline
4const generator = await pipeline(
5 "text-generation",
6 "onnx-community/LFM2-1.2B-ONNX",
7 { dtype: "q4", device: "webgpu" },
8);
9
10// Define the tools available to the model
11const tools = [
12 {
13 name: "get_weather",
14 description: "Get current weather information for a location",
15 parameters: {
16 type: "object",
17 properties: {
18 location: {
19 type: "string",
20 description: "The city and state, e.g. San Francisco, CA",
21 },
22 unit: {
23 type: "string",
24 enum: ["celsius", "fahrenheit"],
25 description: "The unit of temperature to use",
26 },
27 },
28 required: ["location"],
29 },
30 },
31];
32
33// Define the list of messages
34const messages = [
35 { role: "user", content: "What's the weather like in New York?" },
36];
37
38// Generate a response
39const output = await generator(messages, {
40 max_new_tokens: 512,
41 do_sample: false,
42 streamer: new TextStreamer(generator.tokenizer, { skip_prompt: true, skip_special_tokens: true }),
43 tokenizer_encode_kwargs: { tools },
44});
45console.log(output[0].generated_text.at(-1).content);
46// [get_weather(location="New York", unit="fahrenheit")]1from transformers import AutoConfig, AutoTokenizer
2import onnxruntime
3import numpy as np
4from huggingface_hub import snapshot_download
5
6# 1. Load config, processor, and model
7model_id = "onnx-community/LFM2-700M-ONNX"
8config = AutoConfig.from_pretrained(model_id)
9tokenizer = AutoTokenizer.from_pretrained(model_id)
10eos_token_id = config.eos_token_id
11
12filename = "model.onnx" # Options: "model.onnx", "model_fp16.onnx", "model_q4.onnx", "model_q4f16.onnx"
13model_path = snapshot_download(repo_id=model_id, allow_patterns=f"onnx/{filename}*") # Download the graph + weights
14session = onnxruntime.InferenceSession(f"{model_path}/onnx/{filename}")
15
16# 2. Prepare inputs
17prompt = "What is C. elegans?"
18messages = [{"role": "user", "content": prompt}]
19inputs = tokenizer.apply_chat_template(messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="np")
20input_ids = inputs['input_ids']
21attention_mask = inputs['attention_mask']
22batch_size = input_ids.shape[0]
23num_logits_to_keep = np.array(1, dtype=np.int64)
24
25past_cache_values = {}
26for inp in session.get_inputs():
27 name = inp.name
28 shape = inp.shape
29 dtype = np.float32 if inp.type == "tensor(float)" else np.float16
30 if name.startswith("past_key_values"):
31 # Attention KV cache: shape [batch_size, num_kv_heads, 0, head_dim]
32 past_cache_values[name] = np.zeros([batch_size, shape[1], 0, shape[3]], dtype=dtype)
33 elif name.startswith("past_conv"):
34 # Conv cache: shape [batch_size, hidden_size, conv_L_cache]
35 past_cache_values[name] = np.zeros([batch_size, shape[1], shape[2]], dtype=dtype)
36
37# 3. Generation loop
38max_new_tokens = 1024
39generated_tokens = np.array([[]], dtype=np.int64)
40for i in range(max_new_tokens):
41 logits, *present_cache_values = session.run(None, dict(
42 input_ids=input_ids,
43 attention_mask=attention_mask,
44 num_logits_to_keep=num_logits_to_keep,
45 **past_cache_values,
46 ))
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 for j, key in enumerate(past_cache_values):
52 past_cache_values[key] = present_cache_values[j]
53 generated_tokens = np.concatenate([generated_tokens, input_ids], axis=-1)
54 if np.isin(input_ids, eos_token_id).any():
55 break
56
57 ## (Optional) Streaming
58 print(tokenizer.decode(input_ids[0]), end='', flush=True)
59print()
60
61# 4. Output result
62print(tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)[0])