Text Generation
Transformers
Safetensors
scrapegoat
dual-track
parallel-attention
Mixture of Experts
kda
quantile-balancing
Instructions to use scrapegoat/Scrapegoat-Tiny-Coder with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use scrapegoat/Scrapegoat-Tiny-Coder with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="scrapegoat/Scrapegoat-Tiny-Coder")# Load model directly from transformers import AutoModelForCausalLM model = AutoModelForCausalLM.from_pretrained("scrapegoat/Scrapegoat-Tiny-Coder", device_map="auto") - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use scrapegoat/Scrapegoat-Tiny-Coder with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "scrapegoat/Scrapegoat-Tiny-Coder" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "scrapegoat/Scrapegoat-Tiny-Coder", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }'Use Docker
docker model run hf.co/scrapegoat/Scrapegoat-Tiny-Coder
- SGLang
How to use scrapegoat/Scrapegoat-Tiny-Coder 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 "scrapegoat/Scrapegoat-Tiny-Coder" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "scrapegoat/Scrapegoat-Tiny-Coder", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }'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 "scrapegoat/Scrapegoat-Tiny-Coder" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "scrapegoat/Scrapegoat-Tiny-Coder", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }' - Docker Model Runner
How to use scrapegoat/Scrapegoat-Tiny-Coder with Docker Model Runner:
docker model run hf.co/scrapegoat/Scrapegoat-Tiny-Coder
| import torch | |
| import torch.distributed as dist | |
| # copied from https://github.com/KellerJordan/Muon/blob/master/muon.py | |
| def zeropower_via_newtonschulz5(G, steps=5): | |
| """ | |
| Newton-Schulz iteration to compute the zeroth power / orthogonalization of G. We opt to use a | |
| quintic iteration whose coefficients are selected to maximize the slope at zero. For the purpose | |
| of minimizing steps, it turns out to be empirically effective to keep increasing the slope at | |
| zero even beyond the point where the iteration no longer converges all the way to one everywhere | |
| on the interval. This iteration therefore does not produce UV^T but rather something like US'V^T | |
| where S' is diagonal with S_{ii}' ~ Uniform(0.5, 1.5), which turns out not to hurt model | |
| performance at all relative to UV^T, where USV^T = G is the SVD. | |
| """ | |
| assert G.ndim >= 2 # batched Muon implementation by @scottjmaddox, and put into practice in the record by @YouJiacheng | |
| a, b, c = (3.4445, -4.7750, 2.0315) | |
| X = G.bfloat16() | |
| if G.size(-2) > G.size(-1): | |
| X = X.mT | |
| # Ensure spectral norm is at most 1 | |
| X = X / (X.norm(dim=(-2, -1), keepdim=True) + 1e-7) | |
| # Perform the NS iterations | |
| for _ in range(steps): | |
| A = X @ X.mT | |
| B = b * A + c * A @ A # quintic computation strategy adapted from suggestion by @jxbz, @leloykun, and @YouJiacheng | |
| X = a * X + B @ X | |
| if G.size(-2) > G.size(-1): | |
| X = X.mT | |
| return X | |
| def normuon_update(grad, momentum, second_momentum, beta=0.95, beta2=0.95, ns_steps=5, nesterov=True): | |
| momentum.lerp_(grad, 1 - beta) | |
| update = grad.lerp_(momentum, beta) if nesterov else momentum | |
| original_shape = None | |
| if update.ndim == 4: # for the case of conv filters | |
| original_shape = update.shape | |
| update = update.reshape(update.size(0), -1) | |
| update = zeropower_via_newtonschulz5(update, steps=ns_steps) | |
| update = update.to(grad.dtype) | |
| if original_shape is not None: | |
| update = update.reshape(original_shape) | |
| ################ NorMuon added ################### | |
| vnorm = update.norm(dim=(-2,-1), keepdim=True) | |
| v_mean = torch.mean(update * update, dim=-1, keepdim=True) | |
| second_momentum.lerp_(v_mean, 1 - beta2) | |
| step_size = 1 / second_momentum.sqrt().add_(1e-10) | |
| update.mul_(step_size) | |
| vnorm_new = update.norm(dim=(-2,-1), keepdim=True) | |
| update.mul_(vnorm / (vnorm_new.add_(1e-10))) # This scaling keep the update norm the same as pre-normalization | |
| ################################################## | |
| update *= max(1, grad.size(-2) / grad.size(-1))**0.5 | |
| return update | |
| # modified from https://github.com/KellerJordan/Muon/blob/master/muon.py | |
| class NorMuon(torch.optim.Optimizer): | |
| def __init__(self, params, lr=0.02, weight_decay=0, momentum=0.95, beta2=0.95): | |
| defaults = dict(lr=lr, weight_decay=weight_decay, momentum=momentum, beta2=beta2) | |
| assert isinstance(params, list) and len(params) >= 1 and isinstance(params[0], torch.nn.Parameter) | |
| params = sorted(params, key=lambda x: x.size(), reverse=True) | |
| super().__init__(params, defaults) | |
| def step(self, closure=None): | |
| loss = None | |
| if closure is not None: | |
| with torch.enable_grad(): | |
| loss = closure() | |
| for group in self.param_groups: | |
| params = group["params"] | |
| params_pad = params + [torch.empty_like(params[-1])] * (dist.get_world_size() - len(params) % dist.get_world_size()) | |
| for base_i in range(len(params))[::dist.get_world_size()]: | |
| if base_i + dist.get_rank() < len(params): | |
| p = params[base_i + dist.get_rank()] | |
| had_grad = p.grad is not None | |
| if not had_grad: | |
| # continue | |
| p.grad = torch.zeros_like(p) # Force synchronization | |
| state = self.state[p] | |
| if len(state) == 0: | |
| state["momentum_buffer"] = torch.zeros_like(p) | |
| state["second_momentum_buffer"] = torch.zeros_like(p[..., 0:1]) | |
| update = normuon_update(p.grad, state["momentum_buffer"], state["second_momentum_buffer"], beta=group["momentum"], beta2=group["beta2"]) | |
| if group["weight_decay"] and had_grad: | |
| p.mul_(1 - group["lr"] * group["weight_decay"]) | |
| p.add_(update.reshape(p.shape), alpha=-group["lr"]) | |
| dist.all_gather(params_pad[base_i:base_i + dist.get_world_size()], params_pad[base_i + dist.get_rank()]) | |
| return loss | |
| # modified from https://github.com/KellerJordan/Muon/blob/master/muon.py | |
| class SingleDeviceNorMuon(torch.optim.Optimizer): | |
| """ | |
| Muon variant for usage in non-distributed settings. | |
| """ | |
| def __init__(self, params, lr=0.02, weight_decay=0, momentum=0.95, beta2=0.95): | |
| defaults = dict(lr=lr, weight_decay=weight_decay, momentum=momentum, beta2=beta2) | |
| super().__init__(params, defaults) | |
| def step(self, closure=None): | |
| loss = None | |
| if closure is not None: | |
| with torch.enable_grad(): | |
| loss = closure() | |
| for group in self.param_groups: | |
| for p in group["params"]: | |
| had_grad = p.grad is not None | |
| if not had_grad: | |
| # continue | |
| p.grad = torch.zeros_like(p) # Force synchronization | |
| state = self.state[p] | |
| if len(state) == 0: | |
| state["momentum_buffer"] = torch.zeros_like(p) | |
| state["second_momentum_buffer"] = torch.zeros_like(p[...,0:1]) | |
| update = normuon_update(p.grad, state["momentum_buffer"], state["second_momentum_buffer"], beta=group["momentum"], beta2=group["beta2"]) | |
| if group["weight_decay"] and had_grad: | |
| p.mul_(1 - group["lr"] * group["weight_decay"]) | |
| p.add_(update.reshape(p.shape), alpha=-group["lr"]) | |
| return loss | |
| def adam_update(grad, buf1, buf2, step, betas, eps): | |
| buf1.lerp_(grad, 1 - betas[0]) | |
| buf2.lerp_(grad.square(), 1 - betas[1]) | |
| buf1c = buf1 / (1 - betas[0]**step) | |
| buf2c = buf2 / (1 - betas[1]**step) | |
| return buf1c / (buf2c.sqrt() + eps) | |
| class NorMuonWithAuxAdam(torch.optim.Optimizer): | |
| """ | |
| Distributed NorMuon variant paired with an auxiliary Adam optimizer for parameters that are not | |
| compatible with NorMuon. Groups intended for NorMuon should set `use_muon=True`. | |
| """ | |
| def __init__(self, param_groups): | |
| for group in param_groups: | |
| assert "use_muon" in group | |
| if group["use_muon"]: | |
| group["params"] = sorted(group["params"], key=lambda x: x.size(), reverse=True) | |
| group["lr"] = group.get("lr", 0.02) | |
| group["momentum"] = group.get("momentum", 0.95) | |
| group["beta2"] = group.get("beta2", 0.95) | |
| group["weight_decay"] = group.get("weight_decay", 0) | |
| assert set(group.keys()) == {"params", "lr", "momentum", "beta2", "weight_decay", "use_muon"} | |
| else: | |
| group["lr"] = group.get("lr", 3e-4) | |
| group["betas"] = group.get("betas", (0.9, 0.95)) | |
| group["eps"] = group.get("eps", 1e-10) | |
| group["weight_decay"] = group.get("weight_decay", 0) | |
| assert set(group.keys()) == {"params", "lr", "betas", "eps", "weight_decay", "use_muon"} | |
| super().__init__(param_groups, dict()) | |
| def step(self, closure=None): | |
| loss = None | |
| if closure is not None: | |
| with torch.enable_grad(): | |
| loss = closure() | |
| for group in self.param_groups: | |
| if group["use_muon"]: | |
| params = group["params"] | |
| params_pad = params + [torch.empty_like(params[-1])] * (dist.get_world_size() - len(params) % dist.get_world_size()) | |
| for base_i in range(len(params))[::dist.get_world_size()]: | |
| if base_i + dist.get_rank() < len(params): | |
| p = params[base_i + dist.get_rank()] | |
| had_grad = p.grad is not None | |
| if not had_grad: | |
| p.grad = torch.zeros_like(p) | |
| state = self.state[p] | |
| if len(state) == 0: | |
| state["momentum_buffer"] = torch.zeros_like(p) | |
| state["second_momentum_buffer"] = torch.zeros_like(p[..., 0:1]) | |
| update = normuon_update(p.grad, state["momentum_buffer"], state["second_momentum_buffer"], | |
| beta=group["momentum"], beta2=group["beta2"]) | |
| if group["weight_decay"] and had_grad: | |
| p.mul_(1 - group["lr"] * group["weight_decay"]) | |
| p.add_(update.reshape(p.shape), alpha=-group["lr"]) | |
| dist.all_gather(params_pad[base_i:base_i + dist.get_world_size()], params_pad[base_i + dist.get_rank()]) | |
| else: | |
| for p in group["params"]: | |
| had_grad = p.grad is not None | |
| if not had_grad: | |
| p.grad = torch.zeros_like(p) | |
| state = self.state[p] | |
| if len(state) == 0: | |
| state["exp_avg"] = torch.zeros_like(p) | |
| state["exp_avg_sq"] = torch.zeros_like(p) | |
| state["step"] = 0 | |
| state["step"] += 1 | |
| update = adam_update(p.grad, state["exp_avg"], state["exp_avg_sq"], | |
| state["step"], group["betas"], group["eps"]) | |
| if group["weight_decay"] and had_grad: | |
| p.mul_(1 - group["lr"] * group["weight_decay"]) | |
| p.add_(update, alpha=-group["lr"]) | |
| return loss | |
| class SingleDeviceNorMuonWithAuxAdam(torch.optim.Optimizer): | |
| """ | |
| Non-distributed counterpart to NorMuonWithAuxAdam. | |
| """ | |
| def __init__(self, param_groups): | |
| for group in param_groups: | |
| assert "use_muon" in group | |
| if group["use_muon"]: | |
| group["lr"] = group.get("lr", 0.02) | |
| group["momentum"] = group.get("momentum", 0.95) | |
| group["beta2"] = group.get("beta2", 0.95) | |
| group["weight_decay"] = group.get("weight_decay", 0) | |
| assert set(group.keys()) == {"params", "lr", "momentum", "beta2", "weight_decay", "use_muon"} | |
| else: | |
| group["lr"] = group.get("lr", 3e-4) | |
| group["betas"] = group.get("betas", (0.9, 0.95)) | |
| group["eps"] = group.get("eps", 1e-10) | |
| group["weight_decay"] = group.get("weight_decay", 0) | |
| assert set(group.keys()) == {"params", "lr", "betas", "eps", "weight_decay", "use_muon"} | |
| super().__init__(param_groups, dict()) | |
| def step(self, closure=None): | |
| loss = None | |
| if closure is not None: | |
| with torch.enable_grad(): | |
| loss = closure() | |
| for group in self.param_groups: | |
| if group["use_muon"]: | |
| for p in group["params"]: | |
| had_grad = p.grad is not None | |
| if not had_grad: | |
| p.grad = torch.zeros_like(p) | |
| state = self.state[p] | |
| if len(state) == 0: | |
| state["momentum_buffer"] = torch.zeros_like(p) | |
| state["second_momentum_buffer"] = torch.zeros_like(p[..., 0:1]) | |
| update = normuon_update(p.grad, state["momentum_buffer"], state["second_momentum_buffer"], | |
| beta=group["momentum"], beta2=group["beta2"]) | |
| if group["weight_decay"] and had_grad: | |
| p.mul_(1 - group["lr"] * group["weight_decay"]) | |
| p.add_(update.reshape(p.shape), alpha=-group["lr"]) | |
| else: | |
| for p in group["params"]: | |
| had_grad = p.grad is not None | |
| if not had_grad: | |
| p.grad = torch.zeros_like(p) | |
| state = self.state[p] | |
| if len(state) == 0: | |
| state["exp_avg"] = torch.zeros_like(p) | |
| state["exp_avg_sq"] = torch.zeros_like(p) | |
| state["step"] = 0 | |
| state["step"] += 1 | |
| update = adam_update(p.grad, state["exp_avg"], state["exp_avg_sq"], | |
| state["step"], group["betas"], group["eps"]) | |
| if group["weight_decay"] and had_grad: | |
| p.mul_(1 - group["lr"] * group["weight_decay"]) | |
| p.add_(update, alpha=-group["lr"]) | |
| return loss | |