Translation
Transformers
Safetensors
English
mistral3
image-text-to-text
code
code-translation
sas
r
python
lora
axolotl
Instructions to use ProCogia/Euclid-2.6 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use ProCogia/Euclid-2.6 with Transformers:
# Use a pipeline as a high-level helper # Warning: Pipeline type "translation" is no longer supported in transformers v5. # You must load the model directly (see below) or downgrade to v4.x with: # 'pip install "transformers<5.0.0' from transformers import pipeline pipe = pipeline("translation", model="ProCogia/Euclid-2.6")# Load model directly from transformers import AutoProcessor, AutoModelForMultimodalLM processor = AutoProcessor.from_pretrained("ProCogia/Euclid-2.6") model = AutoModelForMultimodalLM.from_pretrained("ProCogia/Euclid-2.6", device_map="auto") - Notebooks
- Google Colab
- Kaggle
File size: 9,065 Bytes
2e375e4 938649c 2e375e4 938649c 2e375e4 938649c 2e375e4 938649c 2e375e4 938649c 2e375e4 938649c 2e375e4 938649c 2e375e4 938649c 2e375e4 938649c 2e375e4 938649c 2e375e4 938649c 2e375e4 938649c 2e375e4 938649c 2e375e4 938649c 2e375e4 938649c 2e375e4 938649c 2e375e4 938649c 2e375e4 938649c 2e375e4 938649c 2e375e4 938649c | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 | ---
license: apache-2.0
library_name: transformers
pipeline_tag: translation
language:
- en
tags:
- code
- code-translation
- sas
- r
- python
- lora
- axolotl
---
# Euclid-2.6
Bidirectional SAS ↔ R ↔ Python program translation. A 24B dense code model, LoRA-tuned and merged to standalone BF16 weights.
## Model Summary
Euclid-2.6 translates complete statistical and data-processing programs across all six directed pairs over {SAS, Python, R}. The training objective is **behavioural equivalence**: given identical inputs, the translated program must compute identical values and bind them to identically-named results.
| | |
|---|---|
| Developer | ProCogia |
| Method | LoRA SFT (r=128), adapter merged into the weights |
| Checkpoint | step 368 (1.0 epoch) |
| Parameters | 24B dense |
| Hidden / layers / intermediate | 5120 / 40 / 32768 |
| Attention heads / KV heads / head dim | 32 / 8 / 128 |
| Tokenizer | Tekken, 131,072 vocab |
| Context | 256k architectural; trained at 8,192 |
| Precision | BF16, ~48 GB |
| License | Apache 2.0 |
**Multimodality.** A vision tower is present in the architecture and untouched by fine-tuning. The model is text-only in practice; the tower carries ~1–2 GB of inert VRAM and dictates the loader class (see [How to Use](#how-to-use)).
## Intended Use
- Single-turn translation of complete programs across the six directed pairs over {SAS, Python, R}.
- Target environments matching the training distribution: **R** — base R plus `dplyr`; **Python** — `pandas`, `numpy`, `scipy`, `statsmodels`.
- Output contract: the translated program only, no prose, no markdown fences.
## How to Use
### Loader class
`AutoModelForCausalLM` raises `Unrecognized configuration class`.
```python
import torch
from transformers import AutoModelForImageTextToText
model = AutoModelForImageTextToText.from_pretrained(
"ProCogia/Euclid-2.6",
torch_dtype=torch.bfloat16,
device_map="auto",
)
```
Tokenization must route through `mistral-common` using the bundled `tekken.json`.
### vLLM
```bash
vllm serve ProCogia/Euclid-2.6 \
--tokenizer-mode mistral \
--max-model-len 16384
```
`--tokenizer-mode mistral` is required. Routing through a jinja template instead of `mistral-common` produces systematically degraded output that closely resembles a genuine accuracy result.
### Prompt format
The model was trained against a single system prompt across every row. Deviating from its contract is off-distribution. The exact prompt (MD5 prefix `dc99ebd18483`) ships with the proprietary training data; the block below reproduces its contract:
```text
You are a code translation engine for statistical and data-processing programs written in SAS, Python, and R.
You are given one complete program in a source language and produce the equivalent program in the target language. Behavioural equivalence is the only criterion: given the same inputs, your program must compute the same values and place them in results carrying the same names.
- Preserve the source program's structure, step order, and intent. Carry its comments across as comments in the target language, and add a brief comment where the target expresses a source construct non-obviously.
- Name every result exactly as the source names it, so results can be compared name for name.
- SAS semantics decide the answer even when SAS is not the target language. A SAS date is whole days since 1960-01-01 and a datetime is seconds since 1960-01-01, both stored as plain numbers. A SAS FORMAT changes only how a value is displayed, never what is stored. Missing (.) sorts below every number, so `x < 5` is true when x is missing. Character values are blank-padded to a declared length and compare ignoring trailing blanks.
- A step that only prints or plots produces no data and has no translation outside SAS; leave it out rather than inventing an equivalent.
- Respond with the translated program and nothing else: no prose, no explanation, no markdown code fences, no placeholders.
```
The user turn is:
1. `Translate the following {SOURCE} program to {TARGET}.`
2. A target-language instruction block (one of three: R, Python, SAS) specifying the permitted library environment.
3. The source program, fenced with the **source** language tag.
The model emits a bare program. Absence of a ```` ```sas ```` fence is the direct signal that the fine-tuned weights are active — the untuned weights emit markdown fences, these do not.
## Training Data
**Proprietary. Not released.** Composition is disclosed below for reproducibility of method, not of data.
| | |
|---|---|
| Training rows |**12,952**|
| In-loop validation | 120|
| Held-out execution set | 424|
| Format | JSONL, single-turn `system` + `user` + `assistant` |
| Length (chars) | mean 6,226 / p50 4,682 / p90 11,690 / p99 21,205 / max 68,627 |
Direction balance:
| Direction | Rows | Direction | Rows |
|---|---|---|---|
| Python→R | 2,070 | R→SAS | 2,213 |
| Python→SAS | 2,199 | SAS→Python | 2,199 |
| R→Python | 2,070 | SAS→R | 2,213 |
## Training Procedure
### Weight preparation
The starting checkpoint ships in native FP8 (`float8_e4m3fn`, block-quantized) with no official BF16 weights, and FP8 does not support training. Casting via `model.to(torch.bfloat16)` **silently no-ops** on quantized linear layers, writing FP8 bytes labelled BF16.
Weights were dequantized by streaming safetensors shards directly:
```
W_bf16 = W_fp8.to(float32) × expand_blocks(weight_scale_inv)
```
280 tensors (40 layers × 7 projections) were converted — exactly the modules LoRA attaches to. `activation_scale`, `input_scale`, and `kv_scale` are FP8-runtime only and were discarded. Verification: 280/280 converted, on-disk dtype scan `Counter({'BF16': 585})` with zero `F8_E4M3`, finiteness assertion passed on every parameter, 48.0 GB output, and a live generation coherence check.
### LoRA configuration
| Parameter | Value |
|---|---|
| Rank `r` | 128 |
| `alpha` | 256 (α = 2r → rank-independent scaling factor of 2) |
| Dropout | 0.05 |
| Target modules | `q_proj`, `k_proj`, `v_proj`, `o_proj`, `gate_proj`, `up_proj`, `down_proj` |
| Scope | Language model only; vision tower and projector excluded |
| Embeddings / `lm_head` | Frozen |
| Trainable | 739M (≈3.0%) |
Vision exclusion is structural rather than enumerated: the targeting regex keys on `self_attn|mlp` parent names, which exist only in the language model, while the vision tower uses `attention`/`feed_forward`.
MLP targeting accounts for 78.7% of available per-layer LoRA capacity at hidden 5120 / intermediate 32768; attention-only targeting would forfeit four-fifths of it.
### Optimization
| Parameter | Value |
|---|---|
| Learning rate | 1e-4, cosine to 10% of peak |
| Warmup | 30 steps (fixed count, ~4% of 736) |
| Optimizer | `adamw_torch_fused`, β = (0.9, 0.95), wd 0.01 |
| Gradient clipping | 1.0 |
| Micro-batch × accumulation | 1 × 8 (≈36 examples/step) |
| Sequence length | 8,192, sample packing on, cross-sample masked |
| Loss | Completion-only |
| Precision | BF16 + gradient checkpointing, FlashAttention-2 |
| Epochs | 2, checkpointed every 0.5 |
| Seed | 42 |
| Total steps | 736 |
At α=2r, LR 1e-4 is equivalent in effective update magnitude to LR 2e-4 at α=r. Over-length rows were **dropped, never truncated** — 12 rows exceeded 8,192 tokens (0.09%), measured with exact `mistral-common` counts. Truncating an assistant target teaches premature EOS, which is directly harmful on a task whose contract is "the complete program and nothing else."
Six pre-flight gates ran before training: exact token lengths, loss-mask decoding (asserting supervised positions contain only the assistant program), adapter scope and parameter count, packing confirmation, leakage checks, and system-prompt integrity. An adapter weight scan for NaN and residual all-zero `lora_B` tensors was added mid-project and is a required gate for any rerun of this recipe.
### Infrastructure
| | |
|---|---|
| GPU | 1× H100 80GB SXM |
| Framework | Axolotl 0.17.0.dev0, torch 2.10.0+cu128, transformers v5 |
| Peak VRAM | 71.1 GB training / 60.3 GB eval |
| Throughput | ~1,150–1,360 tok/s, ~22 s/step |
## Evaluation
**Pending.**
The planned protocol:
| Element | Specification |
|---|---|
| Set | 424 examples, repo-disjoint, offline |
| Method | Execute source and translation on identical inputs; compare at dataframe level |
| Metric | pass@1, pooled |
| Prompt | Training system prompt, greedy decoding |
## Hardware Requirements
| | |
|---|---|
| Weights on disk | ~48 GB (BF16) |
| KV cache @ 16k context | ~2.6 GB per sequence (40 layers × 8 KV heads × 128 dim) |
| Inert vision tower | ~1–2 GB |
| Practical single-GPU floor | 80 GB (H100 / H200 / A100 80GB) |
| Multi-GPU | 2× 48 GB (L40S, A6000) with tensor parallelism |
## Citation
```bibtex
@misc{euclid_2_5,
title = {Euclid-2.6: Bidirectional SAS/R/Python Program Translation},
author = {ProCogia},
year = {2026},
url = {https://huggingface.co/ProCogia/Euclid-2.6}
}
``` |