192 lines
6.5 KiB
Markdown
192 lines
6.5 KiB
Markdown
---
|
||
title: Linux Command Generator (Llama 3.2 1B)
|
||
tags:
|
||
- text-generation
|
||
- instruction-tuned
|
||
- llama
|
||
- unsloth
|
||
- lora
|
||
- linux
|
||
- command-generation
|
||
license: other
|
||
language:
|
||
- en
|
||
library_name: transformers
|
||
pipeline_tag: text-generation
|
||
datasets:
|
||
- custom
|
||
base_model: unsloth/Llama-3.2-1B-Instruct
|
||
---
|
||
|
||
### mecha-org/linux-command-generator-llama3.2-1b
|
||
|
||
Natural language → Linux command. A compact Llama 3.2 1B Instruct model fine‑tuned (LoRA) to turn plain‑English requests into correct shell commands.
|
||
|
||
## Video Demonstration of the model running on the Mecha Comet
|
||
<video controls>
|
||
<source src="https://web-assets.mecha.so/hugging-face/mecha-command-generator-aug-10-2025.mp4" type="video/mp4">
|
||
Your browser does not support the video tag.
|
||
</video>
|
||
For more information of the Mecha Comet, our pocket little handheld computer - click <a href="https://mecha.so/comet">here</a>
|
||
|
||
### TL;DR
|
||
- Base: `unsloth/Llama-3.2-1B-Instruct`
|
||
- Method: LoRA (r=16, alpha=16, dropout=0)
|
||
- Context: 2048 tokens
|
||
- Data: 8,669 pairs across 11 categories
|
||
- Use cases: quick command lookup, learning CLI, automation
|
||
|
||
## Run with Ollama (baby steps)
|
||
|
||
1) Install Ollama: see `https://ollama.com/download`.
|
||
|
||
2) Verify install:
|
||
```bash
|
||
ollama --version
|
||
```
|
||
|
||
3) Run the model interactively:
|
||
```bash
|
||
ollama run mecha-org/linux-command-generator-llama3.2-1b
|
||
```
|
||
Then type a request, e.g.:
|
||
- "List all files in the current directory with detailed information"
|
||
- "Compress the file data.txt using bzip2"
|
||
- "Find all .py files in the current directory and subdirectories"
|
||
|
||
Press Ctrl+C to exit.
|
||
|
||
4) One‑off (non‑interactive):
|
||
```bash
|
||
ollama run mecha-org/linux-command-generator-llama3.2-1b -p "Display the first 5 lines of access.log"
|
||
# Expected: head -n 5 access.log
|
||
```
|
||
|
||
5) Get command‑only answers (when needed):
|
||
```bash
|
||
ollama run mecha-org/linux-command-generator-llama3.2-1b -p "Output only the command with no explanation. Show system information including kernel version"
|
||
# Expected: uname -a
|
||
```
|
||
|
||
|
||
### Use a local GGUF with Ollama (fallback)
|
||
If you have `model.gguf`, put it next to a `Modelfile`:
|
||
|
||
```
|
||
FROM ./model.gguf
|
||
PARAMETER temperature 0.2
|
||
PARAMETER top_p 0.9
|
||
PARAMETER num_ctx 2048
|
||
SYSTEM You are a Linux command generator. Output only the command with no explanation.
|
||
TEMPLATE {{ .Prompt }}
|
||
```
|
||
|
||
Create and run:
|
||
```bash
|
||
ollama create linux-cmd-gen -f Modelfile
|
||
ollama run linux-cmd-gen -p "Find all .py files recursively"
|
||
# Expected: find . -name "*.py"
|
||
```
|
||
|
||
## Other ways to use (optional)
|
||
|
||
### Transformers
|
||
```python
|
||
from transformers import AutoModelForCausalLM, AutoTokenizer
|
||
import torch
|
||
|
||
model_id = "mecha-org/linux-command-generator-llama3.2-1b"
|
||
tokenizer = AutoTokenizer.from_pretrained(model_id)
|
||
model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.float16 if torch.cuda.is_available() else None)
|
||
|
||
def generate_command(description: str) -> str:
|
||
messages = [{"role": "user", "content": description}]
|
||
inputs = tokenizer.apply_chat_template(messages, tokenize=True, add_generation_prompt=True, return_tensors="pt")
|
||
if torch.cuda.is_available():
|
||
inputs = inputs.to(model.device)
|
||
model = model.to("cuda")
|
||
outputs = model.generate(input_ids=inputs, max_new_tokens=64)
|
||
return tokenizer.decode(outputs[0], skip_special_tokens=True)
|
||
|
||
print(generate_command("List all files in the current directory with detailed information"))
|
||
# -> ls -la
|
||
```
|
||
|
||
### Unsloth
|
||
```python
|
||
from unsloth import FastLanguageModel
|
||
|
||
model_id = "mecha-org/linux-command-generator-llama3.2-1b"
|
||
model, tokenizer = FastLanguageModel.from_pretrained(model_name=model_id, max_seq_length=2048)
|
||
FastLanguageModel.for_inference(model)
|
||
|
||
msgs = [{"role": "user", "content": "Compress the file data.txt using bzip2"}]
|
||
inputs = tokenizer.apply_chat_template(msgs, tokenize=True, add_generation_prompt=True, return_tensors="pt")
|
||
output = model.generate(input_ids=inputs, max_new_tokens=32)
|
||
print(tokenizer.decode(output[0], skip_special_tokens=True))
|
||
# -> bzip2 data.txt
|
||
```
|
||
|
||
## Example prompts → commands
|
||
- "Show system information including kernel version" → `uname -a`
|
||
- "Find all .py files in the current directory and subdirectories" → `find . -name "*.py"`
|
||
- "Display the first 5 lines of access.log" → `head -n 5 access.log`
|
||
- "Change permissions of script.sh to make it executable for owner" → `chmod +x script.sh`
|
||
- "Create a tar archive backup.tar containing all files in the documents folder" → `tar -cf backup.tar documents/`
|
||
|
||
## Dataset (overview)
|
||
8,669 input→command pairs across:
|
||
- Compression & Archiving: bzip2, gzip, tar, zip
|
||
- File & Directory: cd, cp, find, ls, mkdir, mv, pwd, rm, rmdir, touch
|
||
- Permissions & Ownership: chgrp, chmod, chown
|
||
- Viewing & Editing: cat, echo, head, less, tail, vim
|
||
- Networking: curl, dig, host, ifconfig, ip, netstat, ping, ssh, wget
|
||
- Package mgmt: apt, dpkg
|
||
- Process mgmt: kill, killall, nice, pkill, renice
|
||
- Search & Filter: awk, grep, locate, sed
|
||
- System info/monitoring: df, du, free, top, uname
|
||
- User/group: useradd, usermod, groupadd, passwd, sudo
|
||
- Misc/system control: cron, systemctl, tmux, screen, service
|
||
|
||
Format:
|
||
```json
|
||
{"input": "Describe what you want to do", "output": "linux_command_here"}
|
||
```
|
||
|
||
## Training details
|
||
- Base: `unsloth/Llama-3.2-1B-Instruct`
|
||
- LoRA on attention + MLP projections:
|
||
- r=16, lora_alpha=16, lora_dropout=0
|
||
- target_modules: ["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"]
|
||
- Max sequence length: 2048
|
||
- SFT on responses only (TRL SFTTrainer), Unsloth-optimized
|
||
- Example hparams: per‑device batch 2, grad accum 4, epochs 3, lr 2e‑4
|
||
- Reference: Tesla P100 16GB (~45 minutes), ~2.8GB VRAM (adapters)
|
||
|
||
## Safety and responsible use
|
||
- Always inspect commands before executing.
|
||
- Avoid destructive operations unless you fully understand consequences.
|
||
- For apps, add denylists and validations (e.g., block `rm -rf /`, `mkfs`, `dd`).
|
||
|
||
## Notes on GGUF
|
||
- Works with `llama.cpp` and Ollama.
|
||
- Typical memory (approx.): q4_k_s ~600MB, q4_k_m ~700MB, q8_0 ~1.1GB, f16 ~2.2GB.
|
||
|
||
## License
|
||
Derived from Meta Llama 3.2. Use must comply with the base model license. Check your deployment context for any additional constraints.
|
||
|
||
## Citation
|
||
```
|
||
@software{hrsvrn_linux_command_generator_llama32_1b,
|
||
author = {Harshvardhan Vatsa},
|
||
title = {Linux Command Generator (Llama 3.2 1B)},
|
||
year = {2025},
|
||
url = {https://huggingface.co/mecha-org/linux-command-generator-llama3.2-1b}
|
||
}
|
||
```
|
||
|
||
## Acknowledgements
|
||
- Base: `unsloth/Llama-3.2-1B-Instruct`
|
||
- Libraries: `unsloth`, `transformers`, `trl`, `accelerate`, `bitsandbytes`
|
||
|