From 82161ab0188f5b0b4281d197b60a42b52847a99d Mon Sep 17 00:00:00 2001 From: ModelHub XC Date: Mon, 20 Jul 2026 05:23:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=EF=BC=8C=E7=94=B1ModelHub=20XC=E7=A4=BE=E5=8C=BA=E6=8F=90?= =?UTF-8?q?=E4=BE=9B=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Model: thefabdev/llama-3-docker-ft Source: Original Platform --- .gitattributes | 36 +++++++++++++++++ README.md | 92 ++++++++++++++++++++++++++++++++++++++++++ chat_template.jinja | 5 +++ config.json | 32 +++++++++++++++ generation_config.json | 12 ++++++ model.safetensors | 3 ++ tokenizer.json | 3 ++ tokenizer_config.json | 16 ++++++++ 8 files changed, 199 insertions(+) create mode 100644 .gitattributes create mode 100644 README.md create mode 100644 chat_template.jinja create mode 100644 config.json create mode 100644 generation_config.json create mode 100644 model.safetensors create mode 100644 tokenizer.json create mode 100644 tokenizer_config.json diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..52373fe --- /dev/null +++ b/.gitattributes @@ -0,0 +1,36 @@ +*.7z filter=lfs diff=lfs merge=lfs -text +*.arrow filter=lfs diff=lfs merge=lfs -text +*.bin filter=lfs diff=lfs merge=lfs -text +*.bz2 filter=lfs diff=lfs merge=lfs -text +*.ckpt filter=lfs diff=lfs merge=lfs -text +*.ftz filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text +*.h5 filter=lfs diff=lfs merge=lfs -text +*.joblib filter=lfs diff=lfs merge=lfs -text +*.lfs.* filter=lfs diff=lfs merge=lfs -text +*.mlmodel filter=lfs diff=lfs merge=lfs -text +*.model filter=lfs diff=lfs merge=lfs -text +*.msgpack filter=lfs diff=lfs merge=lfs -text +*.npy filter=lfs diff=lfs merge=lfs -text +*.npz filter=lfs diff=lfs merge=lfs -text +*.onnx filter=lfs diff=lfs merge=lfs -text +*.ot filter=lfs diff=lfs merge=lfs -text +*.parquet filter=lfs diff=lfs merge=lfs -text +*.pb filter=lfs diff=lfs merge=lfs -text +*.pickle filter=lfs diff=lfs merge=lfs -text +*.pkl filter=lfs diff=lfs merge=lfs -text +*.pt filter=lfs diff=lfs merge=lfs -text +*.pth filter=lfs diff=lfs merge=lfs -text +*.rar filter=lfs diff=lfs merge=lfs -text +*.safetensors filter=lfs diff=lfs merge=lfs -text +saved_model/**/* filter=lfs diff=lfs merge=lfs -text +*.tar.* filter=lfs diff=lfs merge=lfs -text +*.tar filter=lfs diff=lfs merge=lfs -text +*.tflite filter=lfs diff=lfs merge=lfs -text +*.tgz filter=lfs diff=lfs merge=lfs -text +*.wasm filter=lfs diff=lfs merge=lfs -text +*.xz filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.zst filter=lfs diff=lfs merge=lfs -text +*tfevents* filter=lfs diff=lfs merge=lfs -text +tokenizer.json filter=lfs diff=lfs merge=lfs -text diff --git a/README.md b/README.md new file mode 100644 index 0000000..a58e573 --- /dev/null +++ b/README.md @@ -0,0 +1,92 @@ +--- +library_name: transformers +base_model: meta-llama/Meta-Llama-3-8B-Instruct +license: llama3 +datasets: +- MattCoddity/dockerNLcommands +language: +- en +tags: +- lora +- docker +- text-generation +pipeline_tag: text-generation +--- + +# llama-3-docker-ft + +LoRA fine-tune of `meta-llama/Meta-Llama-3-8B-Instruct` that translates natural-language +requests into Docker CLI commands. Merged adapter weights (base + LoRA), not an +adapter-only checkpoint. + +This is a learning-lab artifact ([source notebook and writeup](https://github.com/Fakorede/llm-alignment-lab/tree/main/01_lora_sft)), +not a production model. Treat it as a first fine-tuning exercise, not a benchmarked release. + +## Model Details + +- **Base model:** `meta-llama/Meta-Llama-3-8B-Instruct`, loaded in 8-bit (`BitsAndBytesConfig(load_in_8bit=True)`) +- **Fine-tuning method:** LoRA (`peft`), `r=16`, `lora_alpha=32`, dropout `0.05`, + targeting `q_proj`, `k_proj`, `v_proj`, `o_proj`, `gate_proj`, `up_proj`, `down_proj` + (41.9M trainable params, 0.52% of 8.07B total) +- **Merged:** LoRA adapter merged into the base weights before push (`merge_and_unload()`) +- **License:** inherits the [Llama 3 Community License](https://llama.meta.com/llama3/license/) from the base model + +## Training Data + +[`MattCoddity/dockerNLcommands`](https://huggingface.co/datasets/MattCoddity/dockerNLcommands), +an instruction/input/output dataset pairing natural-language requests with the +corresponding Docker CLI command. Split 80/20 train/validation (seed 42). + +## Training Procedure + +`transformers.Trainer` + `TrainingArguments`: batch size 2, gradient accumulation 4 +(effective batch size 8), `paged_adamw_8bit`, learning rate `2e-4`, 2 epochs (484 steps), +fp16, warmup steps 5, weight decay 0.01. + +### Results + +| Metric | Value | +|---|---| +| Train loss (last logged step) | 0.307 | +| Train loss (run average) | 0.461 | +| Eval loss | 0.341 | +| Train runtime | ~2738s (single A100 80GB) | + +## Uses + +**Intended use:** translating short, single-turn natural-language instructions about +containers/images into a Docker CLI command. Example: + +\`\`\`python +import transformers +import torch + +pipeline = transformers.pipeline( + "text-generation", + model="thefabdev/llama-3-docker-ft", + model_kwargs={"torch_dtype": torch.bfloat16}, + device_map="auto", +) + +messages = [ + {"role": "system", "content": "You are a helpful assistant. Translate this sentence in docker command"}, + {"role": "user", "content": "Display the information of the last 4 containers."}, +] + +result = pipeline(messages, max_new_tokens=256, temperature=0.25, top_p=1, repetition_penalty=1.2) +print(result[0]["generated_text"][-1]["content"]) +# docker ps --last 4 +\`\`\` + +**Out of scope:** general-purpose assistant use, multi-turn conversation, any +command generation where correctness/safety of the resulting shell command isn't +independently verified before execution. Generated commands are not validated for +safety and should not be run against production systems without review. + +## Limitations + +- Fine-tuned on a single small, narrow dataset (Docker CLI only), will not generalize + to other CLIs or general instruction-following. +- Trained for 2 epochs on ~800 examples; not evaluated against a held-out benchmark + beyond the validation split loss above. +- No safety/red-teaming evaluation has been performed on this model. \ No newline at end of file diff --git a/chat_template.jinja b/chat_template.jinja new file mode 100644 index 0000000..39bd0c9 --- /dev/null +++ b/chat_template.jinja @@ -0,0 +1,5 @@ +{% set loop_messages = messages %}{% for message in loop_messages %}{% set content = '<|start_header_id|>' + message['role'] + '<|end_header_id|> + +'+ message['content'] | trim + '<|eot_id|>' %}{% if loop.index0 == 0 %}{% set content = bos_token + content %}{% endif %}{{ content }}{% endfor %}{% if add_generation_prompt %}{{ '<|start_header_id|>assistant<|end_header_id|> + +' }}{% endif %} \ No newline at end of file diff --git a/config.json b/config.json new file mode 100644 index 0000000..ea7490e --- /dev/null +++ b/config.json @@ -0,0 +1,32 @@ +{ + "architectures": [ + "LlamaForCausalLM" + ], + "attention_bias": false, + "attention_dropout": 0.0, + "bos_token_id": 128000, + "dtype": "bfloat16", + "eos_token_id": 128009, + "head_dim": 128, + "hidden_act": "silu", + "hidden_size": 4096, + "initializer_range": 0.02, + "intermediate_size": 14336, + "max_position_embeddings": 8192, + "mlp_bias": false, + "model_type": "llama", + "num_attention_heads": 32, + "num_hidden_layers": 32, + "num_key_value_heads": 8, + "pad_token_id": null, + "pretraining_tp": 1, + "rms_norm_eps": 1e-05, + "rope_parameters": { + "rope_theta": 500000.0, + "rope_type": "default" + }, + "tie_word_embeddings": false, + "transformers_version": "5.13.1", + "use_cache": true, + "vocab_size": 128256 +} diff --git a/generation_config.json b/generation_config.json new file mode 100644 index 0000000..a1570ed --- /dev/null +++ b/generation_config.json @@ -0,0 +1,12 @@ +{ + "bos_token_id": 128000, + "do_sample": true, + "eos_token_id": [ + 128001, + 128009 + ], + "max_length": 4096, + "temperature": 0.6, + "top_p": 0.9, + "transformers_version": "5.13.1" +} diff --git a/model.safetensors b/model.safetensors new file mode 100644 index 0000000..056cd2a --- /dev/null +++ b/model.safetensors @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:373197272b4f16a4b6b13cca0d0f71c3f0900b31a3135545ea95e01c84c06f76 +size 16060556616 diff --git a/tokenizer.json b/tokenizer.json new file mode 100644 index 0000000..86a3394 --- /dev/null +++ b/tokenizer.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c5cf44023714fb39b05e71e425f8d7b92805ff73f7988b083b8c87f0bf87393 +size 17209961 diff --git a/tokenizer_config.json b/tokenizer_config.json new file mode 100644 index 0000000..ecc55fc --- /dev/null +++ b/tokenizer_config.json @@ -0,0 +1,16 @@ +{ + "backend": "tokenizers", + "bos_token": "<|begin_of_text|>", + "clean_up_tokenization_spaces": true, + "eos_token": "<|eot_id|>", + "is_local": false, + "local_files_only": false, + "model_input_names": [ + "input_ids", + "attention_mask" + ], + "model_max_length": 1000000000000000019884624838656, + "pad_token": "<|end_of_text|>", + "padding_size": "left", + "tokenizer_class": "TokenizersBackend" +}