Text Generation
Transformers
Safetensors
English
Chinese
edgerock
rock-matrix
awq
int4
4-bit precision
quantized
reasoning
constant-memory
memory-efficient
edge-ai
custom_code
conversational
Instructions to use hkust-aaron/EdgeRock-4B-AWQ with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use hkust-aaron/EdgeRock-4B-AWQ with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="hkust-aaron/EdgeRock-4B-AWQ", trust_remote_code=True) messages = [ {"role": "user", "content": "Who are you?"}, ] pipe(messages)# pip install -U transformers accelerate # Load model directly from transformers import AutoModelForCausalLM model = AutoModelForCausalLM.from_pretrained("hkust-aaron/EdgeRock-4B-AWQ", trust_remote_code=True, device_map="auto") - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use hkust-aaron/EdgeRock-4B-AWQ with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "hkust-aaron/EdgeRock-4B-AWQ" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "hkust-aaron/EdgeRock-4B-AWQ", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/hkust-aaron/EdgeRock-4B-AWQ
- SGLang
How to use hkust-aaron/EdgeRock-4B-AWQ with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "hkust-aaron/EdgeRock-4B-AWQ" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "hkust-aaron/EdgeRock-4B-AWQ", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "hkust-aaron/EdgeRock-4B-AWQ" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "hkust-aaron/EdgeRock-4B-AWQ", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }' - Docker Model Runner
How to use hkust-aaron/EdgeRock-4B-AWQ with Docker Model Runner:
docker model run hf.co/hkust-aaron/EdgeRock-4B-AWQ
Download validate.py from hkust-aaron/EdgeRock-4B-AWQ: direct link, hf CLI and curl.
- Browser
- Download file 5.25 kB
-
https://huggingface.co/hkust-aaron/EdgeRock-4B-AWQ/resolve/main/validate.py
- Command line
-
hf download hf://hkust-aaron/EdgeRock-4B-AWQ/validate.py
-
curl -L -o validate.py https://huggingface.co/hkust-aaron/EdgeRock-4B-AWQ/resolve/main/validate.py
5.25 kB
| import argparse | |
| import json | |
| import re | |
| import time | |
| from pathlib import Path | |
| import torch | |
| from safetensors import safe_open | |
| from transformers import AutoTokenizer | |
| from packed_int4 import PackedLinear, load_int4 | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument('--folder', required=True) | |
| parser.add_argument('--source', required=True) | |
| parser.add_argument('--reload-only', action='store_true') | |
| args = parser.parse_args() | |
| folder, source = Path(args.folder), Path(args.source) | |
| torch.set_num_threads(4) | |
| torch.manual_seed(20261020) | |
| model = load_int4(folder) | |
| tokenizer = AutoTokenizer.from_pretrained(folder, trust_remote_code=True, local_files_only=True) | |
| probe = tokenizer('The sum of 17 and 23 is', return_tensors='pt').to('cuda') | |
| with torch.inference_mode(): | |
| actual = model(**probe, use_cache=False, logits_to_keep=1).logits.float().cpu() | |
| assert torch.isfinite(actual).all() | |
| if args.reload_only: | |
| expected = torch.load(folder/'reference_probe.pt', weights_only=True) | |
| error = (actual-expected).abs().max().item() | |
| assert torch.equal(actual, expected), error | |
| validation = json.loads((folder/'validation.json').read_text()) | |
| validation['fresh_process_reload_max_logit_error'] = error | |
| validation['complete'] = True | |
| (folder/'validation.json').write_text(json.dumps(validation, indent=2, ensure_ascii=False)+'\n') | |
| print(json.dumps({'stage': 'reload_verified', 'max_logit_error': error}), flush=True) | |
| raise SystemExit(0) | |
| torch.save(actual, folder/'reference_probe.pt') | |
| manifest = json.loads((folder/'edgerock_quantization.json').read_text()) | |
| decoded = len(manifest['modules']) | |
| assert sum(isinstance(module, PackedLinear) for module in model.modules()) == decoded | |
| print(json.dumps({'stage': 'packed_model_loaded', 'quantized_modules': decoded}), flush=True) | |
| index = json.loads((source/'model.safetensors.index.json').read_text())['weight_map'] | |
| protected = 0 | |
| for shard in sorted(folder.glob('model*.safetensors')): | |
| with safe_open(shard, framework='pt', device='cpu') as checkpoint: | |
| ordinary = [name for name in checkpoint.keys() if name in index and | |
| name.removesuffix('.weight') not in manifest['modules']] | |
| for original_name in sorted({index[name] for name in ordinary}): | |
| with safe_open(source/original_name, framework='pt', device='cpu') as original: | |
| for name in ordinary: | |
| if index[name] == original_name: | |
| candidate = checkpoint.get_tensor(name) | |
| reference = original.get_tensor(name) | |
| assert candidate.dtype == reference.dtype and torch.equal(candidate, reference), name | |
| protected += 1 | |
| assert protected > 0 | |
| cases = [ | |
| ('multiply', 'Calculate 17 * 23. Give only the answer.', r'\b391\b'), | |
| ('equation', 'Solve x: 3*x + 7 = 31. Give only the answer.', r'\b8\b'), | |
| ('memory_update', 'The active project code is COBALT-7391.\n' | |
| + 'The archive contains ordinary observations about the weather and landscape. '*120 | |
| + '\nUpdate: the active project code is now AMBER-5286. The earlier code is obsolete.\n' | |
| + 'Additional notes record the temperature, wind, and clouds each afternoon. '*160 | |
| + '\nWhat is the active project code now? Give only that code.', r'AMBER-5286'), | |
| ] | |
| rows = [] | |
| for name, prompt, expected in cases: | |
| text = tokenizer.apply_chat_template([{'role': 'user', 'content': prompt}], | |
| tokenize=False, add_generation_prompt=True) | |
| inputs = tokenizer(text, return_tensors='pt', add_special_tokens=False).to('cuda') | |
| started = time.perf_counter() | |
| torch.cuda.reset_peak_memory_stats() | |
| with torch.inference_mode(): | |
| output = model.generate(**inputs, max_new_tokens=2048, do_sample=False, use_cache=True) | |
| torch.cuda.synchronize() | |
| answer = tokenizer.decode(output[0, inputs.input_ids.shape[1]:], skip_special_tokens=True) | |
| final = answer.split('</think>')[-1].strip() | |
| row = { | |
| 'name': name, 'prompt': prompt, 'prompt_tokens': inputs.input_ids.shape[1], | |
| 'output_tokens': output.shape[1]-inputs.input_ids.shape[1], | |
| 'output': answer, 'final_answer': final, | |
| 'matched_expected': bool(re.search(expected, final)), | |
| 'finished_by_eos': int(output[0, -1]) in (248046, 248044), | |
| 'seconds': time.perf_counter()-started, 'peak_allocated_gib': torch.cuda.max_memory_allocated()/2**30, | |
| } | |
| rows.append(row) | |
| print(json.dumps({'stage': 'generation', **row}, ensure_ascii=False), flush=True) | |
| validation = { | |
| 'complete': False, 'format': manifest['method'].upper()+' W4A16', 'unquantized_tensors_exact': protected, | |
| 'packed_linear_modules': decoded, | |
| 'generations': rows, 'all_generation_checks_passed': all(row['matched_expected'] and row['finished_by_eos'] for row in rows), | |
| 'runtime': 'GPU packed INT4 linear weights, fused Triton BF16-activation matmul', | |
| 'hardware': torch.cuda.get_device_name(0), 'max_new_tokens': 2048, 'do_sample': False, | |
| } | |
| (folder/'validation.json').write_text(json.dumps(validation, indent=2, ensure_ascii=False)+'\n') | |
| assert validation['all_generation_checks_passed'], 'Generation checks did not pass; publication has not been started.' | |