Sothay commited on
Commit
88edd90
·
verified ·
1 Parent(s): 76f76f8

Update README.md

Browse files
Files changed (1) hide show
  1. README.md +135 -165
README.md CHANGED
@@ -1,210 +1,180 @@
 
1
  ---
2
- base_model: unsloth/gemma-4-e4b-it-unsloth-bnb-4bit
3
- library_name: peft
4
  pipeline_tag: text-generation
 
 
 
5
  tags:
6
- - base_model:adapter:unsloth/gemma-4-e4b-it-unsloth-bnb-4bit
7
- - lora
8
- - sft
9
- - transformers
10
- - trl
11
- - unsloth
 
12
  ---
13
 
14
- # Model Card for Model ID
15
-
16
- <!-- Provide a quick summary of what the model is/does. -->
17
-
18
-
19
-
20
- ## Model Details
21
-
22
- ### Model Description
23
-
24
- <!-- Provide a longer summary of what this model is. -->
25
-
26
-
27
-
28
- - **Developed by:** [More Information Needed]
29
- - **Funded by [optional]:** [More Information Needed]
30
- - **Shared by [optional]:** [More Information Needed]
31
- - **Model type:** [More Information Needed]
32
- - **Language(s) (NLP):** [More Information Needed]
33
- - **License:** [More Information Needed]
34
- - **Finetuned from model [optional]:** [More Information Needed]
35
-
36
- ### Model Sources [optional]
37
-
38
- <!-- Provide the basic links for the model. -->
39
-
40
- - **Repository:** [More Information Needed]
41
- - **Paper [optional]:** [More Information Needed]
42
- - **Demo [optional]:** [More Information Needed]
43
-
44
- ## Uses
45
-
46
- <!-- Address questions around how the model is intended to be used, including the foreseeable users of the model and those affected by the model. -->
47
-
48
- ### Direct Use
49
-
50
- <!-- This section is for the model use without fine-tuning or plugging into a larger ecosystem/app. -->
51
-
52
- [More Information Needed]
53
-
54
- ### Downstream Use [optional]
55
-
56
- <!-- This section is for the model use when fine-tuned for a task, or when plugged into a larger ecosystem/app -->
57
-
58
- [More Information Needed]
59
-
60
- ### Out-of-Scope Use
61
-
62
- <!-- This section addresses misuse, malicious use, and uses that the model will not work well for. -->
63
-
64
- [More Information Needed]
65
-
66
- ## Bias, Risks, and Limitations
67
-
68
- <!-- This section is meant to convey both technical and sociotechnical limitations. -->
69
-
70
- [More Information Needed]
71
-
72
- ### Recommendations
73
-
74
- <!-- This section is meant to convey recommendations with respect to the bias, risk, and technical limitations. -->
75
-
76
- Users (both direct and downstream) should be made aware of the risks, biases and limitations of the model. More information needed for further recommendations.
77
-
78
- ## How to Get Started with the Model
79
-
80
- Use the code below to get started with the model.
81
-
82
- [More Information Needed]
83
 
84
- ## Training Details
85
 
86
- ### Training Data
87
 
88
- <!-- This should link to a Dataset Card, perhaps with a short stub of information on what the training data is all about as well as documentation related to data pre-processing or additional filtering. -->
89
-
90
- [More Information Needed]
91
-
92
- ### Training Procedure
93
-
94
- <!-- This relates heavily to the Technical Specifications. Content here should link to that section when it is relevant to the training procedure. -->
95
-
96
- #### Preprocessing [optional]
97
-
98
- [More Information Needed]
99
-
100
-
101
- #### Training Hyperparameters
102
-
103
- - **Training regime:** [More Information Needed] <!--fp32, fp16 mixed precision, bf16 mixed precision, bf16 non-mixed precision, fp16 non-mixed precision, fp8 mixed precision -->
104
-
105
- #### Speeds, Sizes, Times [optional]
106
-
107
- <!-- This section provides information about throughput, start/end time, checkpoint size if relevant, etc. -->
108
-
109
- [More Information Needed]
110
-
111
- ## Evaluation
112
-
113
- <!-- This section describes the evaluation protocols and provides the results. -->
114
-
115
- ### Testing Data, Factors & Metrics
116
-
117
- #### Testing Data
118
-
119
- <!-- This should link to a Dataset Card if possible. -->
120
-
121
- [More Information Needed]
122
-
123
- #### Factors
124
-
125
- <!-- These are the things the evaluation is disaggregating by, e.g., subpopulations or domains. -->
126
-
127
- [More Information Needed]
128
-
129
- #### Metrics
130
-
131
- <!-- These are the evaluation metrics being used, ideally with a description of why. -->
132
-
133
- [More Information Needed]
134
 
135
- ### Results
136
 
137
- [More Information Needed]
138
 
139
- #### Summary
 
 
 
 
 
 
 
140
 
 
 
141
 
 
142
 
143
- ## Model Examination [optional]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
144
 
145
- <!-- Relevant interpretability work for the model goes here -->
146
 
147
- [More Information Needed]
148
 
149
- ## Environmental Impact
 
 
 
 
 
 
 
 
150
 
151
- <!-- Total emissions (in grams of CO2eq) and additional considerations, such as electricity usage, go here. Edit the suggested text below accordingly -->
152
 
153
- Carbon emissions can be estimated using the [Machine Learning Impact calculator](https://mlco2.github.io/impact#compute) presented in [Lacoste et al. (2019)](https://arxiv.org/abs/1910.09700).
154
 
155
- - **Hardware Type:** [More Information Needed]
156
- - **Hours used:** [More Information Needed]
157
- - **Cloud Provider:** [More Information Needed]
158
- - **Compute Region:** [More Information Needed]
159
- - **Carbon Emitted:** [More Information Needed]
160
 
161
- ## Technical Specifications [optional]
 
162
 
163
- ### Model Architecture and Objective
 
 
164
 
165
- [More Information Needed]
166
 
167
- ### Compute Infrastructure
 
 
 
168
 
169
- [More Information Needed]
170
 
171
- #### Hardware
172
 
173
- [More Information Needed]
 
 
 
 
 
 
174
 
175
- #### Software
 
 
 
 
176
 
177
- [More Information Needed]
178
 
179
- ## Citation [optional]
180
 
181
- <!-- If there is a paper or blog post introducing the model, the APA and Bibtex information for that should go in this section. -->
182
 
183
- **BibTeX:**
 
 
184
 
185
- [More Information Needed]
186
 
187
- **APA:**
188
 
189
- [More Information Needed]
190
 
191
- ## Glossary [optional]
 
 
 
 
192
 
193
- <!-- If relevant, include terms and calculations in this section that can help readers understand the model or model card. -->
194
 
195
- [More Information Needed]
196
 
197
- ## More Information [optional]
198
 
199
- [More Information Needed]
 
200
 
201
- ## Model Card Authors [optional]
202
 
203
- [More Information Needed]
204
 
205
- ## Model Card Contact
 
206
 
207
- [More Information Needed]
208
- ### Framework versions
209
 
210
- - PEFT 0.19.1
 
 
1
+
2
  ---
3
+ license: gemma
 
4
  pipeline_tag: text-generation
5
+ language:
6
+ - en
7
+ - km
8
  tags:
9
+ - customs
10
+ - hs-code
11
+ - classification
12
+ - cambodia
13
+ - gemma
14
+ - unsloth
15
+ - qlora
16
  ---
17
 
18
+ # Gemma‑4 HS Code Classifier (Cambodia Customs)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
 
20
+ A **Gemma‑4‑E4B‑it** model fine‑tuned with QLoRA to classify product descriptions into **8‑digit HS codes** and return corresponding Cambodian trade rates (Customs Duty, Special Tax, VAT, Excise Tax).
21
 
22
+ Built with **[Unsloth](https://github.com/unslothai/unsloth)** for fast, memory‑efficient fine‑tuning on a single T4 GPU.
23
 
24
+ ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
 
26
+ ## 🎯 What it does
27
 
28
+ Given a plain‑English product description, the model generates:
29
 
30
+ ```text
31
+ HS Code: 61091000
32
+ Unit: PIECE
33
+ Customs Duty: 25%
34
+ Special Tax: 0%
35
+ VAT: 10%
36
+ Excise Tax: 0%
37
+ ```
38
 
39
+ **⚠️ Important**: The rates in the text are generated by the model and **may be wrong**.
40
+ For production, always use the included **lookup table** (`hs_code_lookup.json`) – see [Production use](#-production-use) below.
41
 
42
+ ---
43
 
44
+ ## 🚀 Quick start (in Colab or locally)
45
+
46
+ This repository contains **only the LoRA adapter**, not the full model.
47
+ Loading it will automatically download the base model (`unsloth/gemma-4-E4B-it`) and apply the adapter in 4-bit.
48
+
49
+ ```python
50
+ from unsloth import FastModel
51
+
52
+ model, tokenizer = FastModel.from_pretrained(
53
+ "Sothay/gemma4-hscode-classifier", # LoRA adapter on Hugging Face
54
+ load_in_4bit = True, # required – the adapter was trained in 4-bit
55
+ max_seq_length = 1024,
56
+ )
57
+
58
+ # ---------- Inference with the authoritative lookup table (recommended) ----------
59
+ import json, re
60
+
61
+ with open("hs_code_lookup.json") as f:
62
+ rate_lookup = json.load(f)
63
+
64
+ def predict_hs_code(description: str) -> dict:
65
+ system_prompt = (
66
+ "You are a customs compliance AI. Classify the product description to its "
67
+ "correct 8-digit HS code and output the corresponding trade rates (Customs Duty, "
68
+ "Special Tax, VAT, Excise Tax) and unit."
69
+ )
70
+ messages = [
71
+ {"role": "system", "content": [{"type": "text", "text": system_prompt}]},
72
+ {"role": "user", "content": [{"type": "text", "text": f"Description: {description}"}]},
73
+ ]
74
+ inputs = tokenizer.apply_chat_template(messages, add_generation_prompt=True, return_tensors="pt").to("cuda")
75
+ out = model.generate(inputs, max_new_tokens=80, do_sample=False)
76
+ text = tokenizer.decode(out[0][inputs.shape[1]:], skip_special_tokens=True)
77
+
78
+ m = re.search(r"HS Code:\s*([0-9]{4,10})", text)
79
+ code = m.group(1) if m else None
80
+ if code and code in rate_lookup:
81
+ return {"hs_code": code, "source": "lookup_table", **rate_lookup[code]}
82
+ return {"hs_code": code, "source": "model_only_UNVERIFIED", "raw_output": text}
83
+
84
+ print(predict_hs_code("Men's cotton knitted T-shirt"))
85
+ ```
86
 
87
+ ---
88
 
89
+ ## 🧠 Training details
90
 
91
+ - **Base model**: `unsloth/gemma-4-E4B-it` (4‑bit QLoRA)
92
+ - **Adapter rank**: r=16, alpha=16, targeting all language & attention layers
93
+ - **Gradient checkpointing**: Unsloth’s own implementation (avoids Gemma‑4 KV‑shared layer bug)
94
+ - **Dataset**: Custom Cambodian HS‑code dataset (`hs_code.csv`) with descriptions, codes, and official rates
95
+ - Cleaned, deduplicated, split into 90/10 train/validation
96
+ - Chat roles fixed to system/user/assistant (Gemma‑4 standard)
97
+ - **Training config**: 3 epochs, effective batch size 8, learning rate 2e‑4, linear schedule, eval & save every epoch, best model loaded
98
+ - **Hardware**: Google Colab T4 (16 GB) – peak memory ~10 GB thanks to QLoRA
99
+ - **Accuracy**: Evaluated on held‑out examples (exact HS‑code match) – see model card for current numbers
100
 
101
+ ---
102
 
103
+ ## ⚖️ Production use
104
 
105
+ > **Always use the lookup table – never trust the model’s generated rates.**
 
 
 
 
106
 
107
+ The model is a **classifier**: description → HS code.
108
+ Rates are fetched deterministically from `hs_code_lookup.json`, a file extracted from the same official tariff data used during training.
109
 
110
+ Why?
111
+ - A causal LM recalling a rate from memory will occasionally hallucinate – a customs tool with confident, wrong numbers is worse than one that says “I don’t know”.
112
+ - The lookup table guarantees 100% accuracy on rates once the HS code is correct.
113
 
114
+ The `hs_code_lookup.json` file is included in this repository and can be downloaded via:
115
 
116
+ ```python
117
+ from huggingface_hub import hf_hub_download
118
+ hf_hub_download("Sothay/gemma4-hscode-classifier", "hs_code_lookup.json")
119
+ ```
120
 
121
+ ---
122
 
123
+ ## 📦 Files in this repository
124
 
125
+ | File | Description |
126
+ |------|-------------|
127
+ | `adapter_model.safetensors` | LoRA adapter weights (few MB) |
128
+ | `adapter_config.json` | Adapter configuration (references base model) |
129
+ | `tokenizer.json`, `tokenizer_config.json` | Tokenizer files |
130
+ | `hs_code_lookup.json` | Authoritative rate table for production inference |
131
+ | `README.md` | This file |
132
 
133
+ > **Note**: Only the adapter is stored here – the full Gemma‑4 base model is automatically fetched from Unsloth when you call `FastModel.from_pretrained`.
134
+ > If you need a **merged, full‑precision model** (for vLLM, TGI, etc.), generate it locally with Unsloth:
135
+ > ```python
136
+ > model.save_pretrained_merged("merged_fp16", tokenizer, save_method="merged_16bit")
137
+ > ```
138
 
139
+ ---
140
 
141
+ ## 🦙 Ollama / llama.cpp (GGUF)
142
 
143
+ Export a quantized GGUF directly from the loaded adapter:
144
 
145
+ ```python
146
+ model.save_pretrained_gguf("gguf_model", tokenizer, quantization_method="q4_k_m")
147
+ ```
148
 
149
+ Then use with Ollama (see [`Modelfile` example](https://ollama.com) – set temperature 0, deterministic sampling).
150
 
151
+ ---
152
 
153
+ ## 📊 Example predictions
154
 
155
+ | Description | Predicted HS Code | Unit | CD | ST | VAT | ET |
156
+ |-------------|-------------------|------|----|----|-----|----|
157
+ | Toyota Hilux pickup, diesel 2.8L | 8704 | u | 35% | 50% | 10% | 0% |
158
+ | iPhone 15 Pro Max 256GB | 8517 | u | 0% | 0% | 10% | 0% |
159
+ | Heineken beer 330ml can | 2203 | l | 35% | 30% | 10% | 0% |
160
 
161
+ *(Rates from lookup table not generated by the model.)*
162
 
163
+ ---
164
 
165
+ ## 📝 License
166
 
167
+ This model is a derivative of **Gemma‑4‑E4B‑it** and is subject to the [Gemma license](https://ai.google.dev/gemma/terms).
168
+ The HS‑code dataset and lookup table are the property of their respective owners.
169
 
170
+ ---
171
 
172
+ ## 🙏 Acknowledgments
173
 
174
+ - [Unsloth](https://github.com/unslothai/unsloth) made QLoRA + Gemma‑4 on a T4 effortless
175
+ - [Google DeepMind](https://deepmind.google) – for the Gemma family of models
176
 
177
+ ---
 
178
 
179
+ **Author**: [Sothay](https://huggingface.co/Sothay)
180
+ **Model card version**: 1.1