Correct task metadata, official branding, and verified release documentation
Browse files- README.md +28 -24
- THIRD_PARTY_NOTICES.md +31 -0
- card-architecture.png +2 -2
- card-evaluation.json +21 -11
- card-hero.png +0 -0
- config.json +66 -61
- provenance.json +7 -2
README.md
CHANGED
|
@@ -1,28 +1,34 @@
|
|
| 1 |
---
|
| 2 |
license: mit
|
| 3 |
-
library_name:
|
|
|
|
| 4 |
model_name: Faynt-10M-Arena
|
| 5 |
inference: false
|
| 6 |
tags:
|
| 7 |
- reinforcement-learning
|
| 8 |
- game-playing
|
|
|
|
| 9 |
- melee
|
| 10 |
- imitation-learning
|
| 11 |
- custom-code
|
| 12 |
- pytorch
|
|
|
|
|
|
|
| 13 |
datasets:
|
| 14 |
- erickfm/melee-ranked-replays
|
| 15 |
base_model: frisson-labs/Faynt-10M-Expert
|
| 16 |
base_model_relation: finetune
|
| 17 |
---
|
| 18 |
|
| 19 |
-

|
|
|
|
|
|
|
| 20 |
|
| 21 |
<p align="center"><a href="#results">Results</a> · <a href="#insights">Insights</a> · <a href="#training">Training</a> · <a href="#architecture">Architecture</a> · <a href="#use">Use the model</a></p>
|
| 22 |
|
| 23 |
**The compact policy selected for the final competitive benchmark.**
|
| 24 |
|
| 25 |
-
Faynt predicts the next GameCube controller command from structured Melee state and recent controller history. This release includes the frame encoder, causal Transformer, autoregressive controller heads, and the native action codec. One set of weights controls all 26 characters.
|
| 26 |
|
| 27 |
<table><tr><td align="center" width="33%"><h3>98.4%</h3><strong>Supported mirrors</strong><br><sub>240/244 games</sub></td><td align="center" width="33%"><h3>68/68</h3><strong>Zero-delay Slippi-AI</strong><br><sub>Two conditioning settings</sub></td><td align="center" width="33%"><h3>26</h3><strong>Characters</strong><br><sub>One shared checkpoint</sub></td></tr></table>
|
| 28 |
|
|
@@ -30,7 +36,7 @@ Faynt predicts the next GameCube controller command from structured Melee state
|
|
| 30 |
|
| 31 |
**Timing matters:** Faynt has zero added policy delay; these opponents retain 21- or 24-frame action queues. The report does not isolate the effect of that difference. Supported mirrors use the opponent’s deployed characters. Extended-roster games keep the opponent on a supported fighter. Forced mirrors put both agents on a character outside the opponent’s deployed roster. Each Arena checkpoint plays 1,312 games across the three conditions.
|
| 32 |
|
| 33 |
-

|
| 34 |
|
| 35 |
*The two policies have different RL histories. This is a comparison of selected trained policies.*
|
| 36 |
|
|
@@ -54,7 +60,7 @@ Both sides use zero added policy delay in these panels. The Slippi-AI checkpoint
|
|
| 54 |
The private Slippi-AI rows form a matched Expert-to-Arena comparison: 23 to 68 wins at 10M, and 25 to 58 at 75M. Phillip chooses an action every 2, 3, or 4 frames, depending on the specialist; Faynt chooses each frame. These are finite evaluation panels. Several opponents in the wider benchmark also informed RL run or checkpoint selection.
|
| 55 |
|
| 56 |
|
| 57 |
-
Source: *Faynt: Scaling and Optimizing Policies for Competitive Melee*, Sections 5 and 6 and the benchmark appendices. The [evaluation manifest](./card-evaluation.json) records the specific source tables, denominators, and qualifications.
|
| 58 |
|
| 59 |
## Insights
|
| 60 |
|
|
@@ -98,7 +104,7 @@ Arena uses PPO with stock, damage, movement, and positioning reward terms. Its R
|
|
| 98 |
|
| 99 |
## Architecture
|
| 100 |
|
| 101 |
-

|
| 102 |
|
| 103 |
The controller distribution factors into a **728-way joint-control choice**, followed by an **85-way main-stick choice conditioned on that choice**. The joint category includes buttons, shoulder pressure, and C-stick position. The codec converts both categories into a complete controller command.
|
| 104 |
|
|
@@ -111,7 +117,8 @@ The controller distribution factors into a **728-way joint-control choice**, fol
|
|
| 111 |
| Model width / blocks | 384 / 5 |
|
| 112 |
| Query heads / key-value heads | 6 / 2 |
|
| 113 |
| Head dimension / feed-forward width | 64 / 768 |
|
| 114 |
-
|
|
|
|
|
| 115 |
| Stored weights / default compute / cache | FP32 / FP32 / FP32 |
|
| 116 |
| Prediction offset | One frame |
|
| 117 |
|
|
@@ -144,20 +151,17 @@ print(output.controller.as_packed_tensor().shape) # torch.Size([1, 1, 13])
|
|
| 144 |
`example_inputs` creates synthetic structured states for a loading check. Live play requires a Slippi/Dolphin adapter that parses the game, assigns player perspective, synchronizes frames, and executes commands. `trust_remote_code=True` loads the custom model source included here. Authenticate with `hf auth login` when repository access requires it.
|
| 145 |
|
| 146 |
<details>
|
| 147 |
-
<summary><strong>Streaming inference, game resets, and the
|
| 148 |
|
| 149 |
-
The saved configuration
|
| 150 |
|
| 151 |
```python
|
| 152 |
import torch
|
| 153 |
-
from transformers import
|
| 154 |
|
| 155 |
repo_id = "frisson-labs/Faynt-10M-Arena"
|
| 156 |
-
config = AutoConfig.from_pretrained(repo_id, trust_remote_code=True)
|
| 157 |
-
config.model_config["context_length"] = 128
|
| 158 |
-
config.context_length = 128
|
| 159 |
model = AutoModel.from_pretrained(
|
| 160 |
-
repo_id,
|
| 161 |
).eval()
|
| 162 |
|
| 163 |
cache = model.init_cache(batch_size=1)
|
|
@@ -199,7 +203,7 @@ Supply a fresh observed state on each live iteration and feed back the controlle
|
|
| 199 |
| `output.controller` | Decoded logical controller. `as_packed_tensor()` returns `[..., 13]`. |
|
| 200 |
| Packed order | Main x/y, C-stick x/y, shoulder, A, B, X, Y, Z, L, R, D_UP. Stick coordinates use `[0, 1]`. |
|
| 201 |
|
| 202 |
-
`model(...)` performs deterministic or teacher-forced prediction. `model.sample(...)` samples commands. `model.step(...)` processes one frame using a rolling cache. `model.policy` exposes the native encoder, backbone, controller head, and loss. The complete field definitions are in [tensor_batch.py](./tensor_batch.py) and [controller_codec.py](./controller_codec.py).
|
| 203 |
|
| 204 |
</details>
|
| 205 |
|
|
@@ -214,13 +218,13 @@ The report’s optimized T4 decision loop averages **5.2 ms at 10M** and **8.7 m
|
|
| 214 |
|
| 215 |
| File | Purpose |
|
| 216 |
|---|---|
|
| 217 |
-
| [model.safetensors](./model.safetensors) | Policy tensors in their original FP32 values. |
|
| 218 |
-
| [config.json](./config.json) | Complete model configuration and AutoModel mapping. |
|
| 219 |
-
| [modeling_faynt.py](./modeling_faynt.py), [configuration_faynt.py](./configuration_faynt.py) | Transformers interface. |
|
| 220 |
-
| [faynt_native.py](./faynt_native.py), [controller_codec.py](./controller_codec.py), [tensor_batch.py](./tensor_batch.py) | Native policy, codec, and structured tensor contract. |
|
| 221 |
-
| [checkpoint.pt](./checkpoint.pt) | Original checkpoint, retained byte for byte. |
|
| 222 |
-
| [provenance.json](./provenance.json), [runtime_provenance.json](./runtime_provenance.json) | Training lineage and native source hashes. |
|
| 223 |
-
| [card-evaluation.json](./card-evaluation.json) | Reported card metrics and their evaluation context. |
|
| 224 |
|
| 225 |
The release was checked for exact tensor equality, strict native state loading, local `AutoModel` loading, and native forward-output parity. Sampling, cached inference, and independent game resets were also exercised. The uploaded safetensors SHA-256 matches the verified local file.
|
| 226 |
|
|
@@ -229,7 +233,7 @@ model.safetensors SHA-256
|
|
| 229 |
d3a841e6f18eb86ed86d1e94ad0ffc8decebf8dfbb26cc5e670c0fd68a5409b2
|
| 230 |
```
|
| 231 |
|
| 232 |
-
Validated with PyTorch 2.13.0, Transformers 4.57.6, and safetensors 0.8.0. The [requirements](./requirements.txt) record the supported dependency range.
|
| 233 |
|
| 234 |
</details>
|
| 235 |
|
|
@@ -246,4 +250,4 @@ Validated with PyTorch 2.13.0, Transformers 4.57.6, and safetensors 0.8.0. The [
|
|
| 246 |
|
| 247 |
**Frisson Labs · Faynt**
|
| 248 |
|
| 249 |
-
Model code and weights: [MIT license](./LICENSE). Melee and the emulator are obtained separately under their respective terms.
|
|
|
|
| 1 |
---
|
| 2 |
license: mit
|
| 3 |
+
library_name: pytorch
|
| 4 |
+
pipeline_tag: other
|
| 5 |
model_name: Faynt-10M-Arena
|
| 6 |
inference: false
|
| 7 |
tags:
|
| 8 |
- reinforcement-learning
|
| 9 |
- game-playing
|
| 10 |
+
- action-prediction
|
| 11 |
- melee
|
| 12 |
- imitation-learning
|
| 13 |
- custom-code
|
| 14 |
- pytorch
|
| 15 |
+
- arena
|
| 16 |
+
- ppo
|
| 17 |
datasets:
|
| 18 |
- erickfm/melee-ranked-replays
|
| 19 |
base_model: frisson-labs/Faynt-10M-Expert
|
| 20 |
base_model_relation: finetune
|
| 21 |
---
|
| 22 |
|
| 23 |
+

|
| 24 |
+
|
| 25 |
+
<p align="center"><a href="https://huggingface.co/collections/frisson-labs/faynt">Model collection</a> · <a href="https://github.com/Na00s/Faynt-Benchmarks">Benchmark code and results</a> · <a href="https://github.com/Na00s/Faynt-Tournament">Tournament software</a></p>
|
| 26 |
|
| 27 |
<p align="center"><a href="#results">Results</a> · <a href="#insights">Insights</a> · <a href="#training">Training</a> · <a href="#architecture">Architecture</a> · <a href="#use">Use the model</a></p>
|
| 28 |
|
| 29 |
**The compact policy selected for the final competitive benchmark.**
|
| 30 |
|
| 31 |
+
**Task: structured-state game-control policy.** Faynt predicts the next GameCube controller command from structured Melee state and recent controller history. This release includes the frame encoder, causal Transformer, autoregressive controller heads, and the native action codec. One set of weights controls all 26 characters.
|
| 32 |
|
| 33 |
<table><tr><td align="center" width="33%"><h3>98.4%</h3><strong>Supported mirrors</strong><br><sub>240/244 games</sub></td><td align="center" width="33%"><h3>68/68</h3><strong>Zero-delay Slippi-AI</strong><br><sub>Two conditioning settings</sub></td><td align="center" width="33%"><h3>26</h3><strong>Characters</strong><br><sub>One shared checkpoint</sub></td></tr></table>
|
| 34 |
|
|
|
|
| 36 |
|
| 37 |
**Timing matters:** Faynt has zero added policy delay; these opponents retain 21- or 24-frame action queues. The report does not isolate the effect of that difference. Supported mirrors use the opponent’s deployed characters. Extended-roster games keep the opponent on a supported fighter. Forced mirrors put both agents on a character outside the opponent’s deployed roster. Each Arena checkpoint plays 1,312 games across the three conditions.
|
| 38 |
|
| 39 |
+

|
| 40 |
|
| 41 |
*The two policies have different RL histories. This is a comparison of selected trained policies.*
|
| 42 |
|
|
|
|
| 60 |
The private Slippi-AI rows form a matched Expert-to-Arena comparison: 23 to 68 wins at 10M, and 25 to 58 at 75M. Phillip chooses an action every 2, 3, or 4 frames, depending on the specialist; Faynt chooses each frame. These are finite evaluation panels. Several opponents in the wider benchmark also informed RL run or checkpoint selection.
|
| 61 |
|
| 62 |
|
| 63 |
+
Source: *Faynt: Scaling and Optimizing Policies for Competitive Melee*, Sections 5 and 6 and the benchmark appendices. The [evaluation manifest](https://huggingface.co/frisson-labs/Faynt-10M-Arena/blob/main/card-evaluation.json) records the specific source tables, denominators, and qualifications.
|
| 64 |
|
| 65 |
## Insights
|
| 66 |
|
|
|
|
| 104 |
|
| 105 |
## Architecture
|
| 106 |
|
| 107 |
+

|
| 108 |
|
| 109 |
The controller distribution factors into a **728-way joint-control choice**, followed by an **85-way main-stick choice conditioned on that choice**. The joint category includes buttons, shoulder pressure, and C-stick position. The codec converts both categories into a complete controller command.
|
| 110 |
|
|
|
|
| 117 |
| Model width / blocks | 384 / 5 |
|
| 118 |
| Query heads / key-value heads | 6 / 2 |
|
| 119 |
| Head dimension / feed-forward width | 64 / 768 |
|
| 120 |
+
| Native ring-cache capacity | 256 frames |
|
| 121 |
+
| Actor trajectory context | 128 frames for history/rollout bookkeeping |
|
| 122 |
| Stored weights / default compute / cache | FP32 / FP32 / FP32 |
|
| 123 |
| Prediction offset | One frame |
|
| 124 |
|
|
|
|
| 151 |
`example_inputs` creates synthetic structured states for a loading check. Live play requires a Slippi/Dolphin adapter that parses the game, assigns player perspective, synchronizes frames, and executes commands. `trust_remote_code=True` loads the custom model source included here. Authenticate with `hf auth login` when repository access requires it.
|
| 152 |
|
| 153 |
<details>
|
| 154 |
+
<summary><strong>Streaming inference, game resets, and the 256-frame ring cache</strong></summary>
|
| 155 |
|
| 156 |
+
The saved configuration uses a **256-frame continuous ring cache**, temperature 1, FP32 compute/cache, and zero added policy delay. The separate 128-frame actor trajectory context describes history/rollout bookkeeping. Load the saved configuration directly:
|
| 157 |
|
| 158 |
```python
|
| 159 |
import torch
|
| 160 |
+
from transformers import AutoModel
|
| 161 |
|
| 162 |
repo_id = "frisson-labs/Faynt-10M-Arena"
|
|
|
|
|
|
|
|
|
|
| 163 |
model = AutoModel.from_pretrained(
|
| 164 |
+
repo_id, trust_remote_code=True,
|
| 165 |
).eval()
|
| 166 |
|
| 167 |
cache = model.init_cache(batch_size=1)
|
|
|
|
| 203 |
| `output.controller` | Decoded logical controller. `as_packed_tensor()` returns `[..., 13]`. |
|
| 204 |
| Packed order | Main x/y, C-stick x/y, shoulder, A, B, X, Y, Z, L, R, D_UP. Stick coordinates use `[0, 1]`. |
|
| 205 |
|
| 206 |
+
`model(...)` performs deterministic or teacher-forced prediction. `model.sample(...)` samples commands. `model.step(...)` processes one frame using a rolling cache. `model.policy` exposes the native encoder, backbone, controller head, and loss. The complete field definitions are in [tensor_batch.py](https://huggingface.co/frisson-labs/Faynt-10M-Arena/blob/main/tensor_batch.py) and [controller_codec.py](https://huggingface.co/frisson-labs/Faynt-10M-Arena/blob/main/controller_codec.py).
|
| 207 |
|
| 208 |
</details>
|
| 209 |
|
|
|
|
| 218 |
|
| 219 |
| File | Purpose |
|
| 220 |
|---|---|
|
| 221 |
+
| [model.safetensors](https://huggingface.co/frisson-labs/Faynt-10M-Arena/blob/main/model.safetensors) | Policy tensors in their original FP32 values. |
|
| 222 |
+
| [config.json](https://huggingface.co/frisson-labs/Faynt-10M-Arena/blob/main/config.json) | Complete model configuration and AutoModel mapping. |
|
| 223 |
+
| [modeling_faynt.py](https://huggingface.co/frisson-labs/Faynt-10M-Arena/blob/main/modeling_faynt.py), [configuration_faynt.py](https://huggingface.co/frisson-labs/Faynt-10M-Arena/blob/main/configuration_faynt.py) | Transformers interface. |
|
| 224 |
+
| [faynt_native.py](https://huggingface.co/frisson-labs/Faynt-10M-Arena/blob/main/faynt_native.py), [controller_codec.py](https://huggingface.co/frisson-labs/Faynt-10M-Arena/blob/main/controller_codec.py), [tensor_batch.py](https://huggingface.co/frisson-labs/Faynt-10M-Arena/blob/main/tensor_batch.py) | Native policy, codec, and structured tensor contract. |
|
| 225 |
+
| [checkpoint.pt](https://huggingface.co/frisson-labs/Faynt-10M-Arena/blob/main/checkpoint.pt) | Original checkpoint, retained byte for byte. |
|
| 226 |
+
| [provenance.json](https://huggingface.co/frisson-labs/Faynt-10M-Arena/blob/main/provenance.json), [runtime_provenance.json](https://huggingface.co/frisson-labs/Faynt-10M-Arena/blob/main/runtime_provenance.json) | Training lineage and native source hashes. |
|
| 227 |
+
| [card-evaluation.json](https://huggingface.co/frisson-labs/Faynt-10M-Arena/blob/main/card-evaluation.json) | Reported card metrics and their evaluation context. |
|
| 228 |
|
| 229 |
The release was checked for exact tensor equality, strict native state loading, local `AutoModel` loading, and native forward-output parity. Sampling, cached inference, and independent game resets were also exercised. The uploaded safetensors SHA-256 matches the verified local file.
|
| 230 |
|
|
|
|
| 233 |
d3a841e6f18eb86ed86d1e94ad0ffc8decebf8dfbb26cc5e670c0fd68a5409b2
|
| 234 |
```
|
| 235 |
|
| 236 |
+
Validated with PyTorch 2.13.0, Transformers 4.57.6, and safetensors 0.8.0. The [requirements](https://huggingface.co/frisson-labs/Faynt-10M-Arena/blob/main/requirements.txt) record the supported dependency range.
|
| 237 |
|
| 238 |
</details>
|
| 239 |
|
|
|
|
| 250 |
|
| 251 |
**Frisson Labs · Faynt**
|
| 252 |
|
| 253 |
+
Model code and weights: [MIT license](https://huggingface.co/frisson-labs/Faynt-10M-Arena/blob/main/LICENSE) · [Third-party notices](https://huggingface.co/frisson-labs/Faynt-10M-Arena/blob/main/THIRD_PARTY_NOTICES.md). Melee and the emulator are obtained separately under their respective terms.
|
THIRD_PARTY_NOTICES.md
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Third-party source notices
|
| 2 |
+
|
| 3 |
+
The Faynt-owned model code and weights are distributed under the repository's [MIT License](LICENSE).
|
| 4 |
+
|
| 5 |
+
The structured state representation, autoregressive controller interface, and `custom_v1` controller codec follow [Slippi-AI](https://github.com/vladfi1/slippi-ai) at revision [`577965a7731dc53e3472ea63d9e9853a4e9d65fa`](https://github.com/vladfi1/slippi-ai/tree/577965a7731dc53e3472ea63d9e9853a4e9d65fa). In particular, `controller_codec.py` is a PyTorch port of that codec, and `tensor_batch.py` mirrors its state records. The Slippi-AI-derived portions retain the following upstream notice.
|
| 6 |
+
|
| 7 |
+
```text
|
| 8 |
+
MIT License
|
| 9 |
+
|
| 10 |
+
Copyright (c) 2020 Vlad Firoiu
|
| 11 |
+
|
| 12 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
| 13 |
+
of this software and associated documentation files (the "Software"), to deal
|
| 14 |
+
in the Software without restriction, including without limitation the rights
|
| 15 |
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
| 16 |
+
copies of the Software, and to permit persons to whom the Software is
|
| 17 |
+
furnished to do so, subject to the following conditions:
|
| 18 |
+
|
| 19 |
+
The above copyright notice and this permission notice shall be included in all
|
| 20 |
+
copies or substantial portions of the Software.
|
| 21 |
+
|
| 22 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
| 23 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
| 24 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
| 25 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
| 26 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
| 27 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
| 28 |
+
SOFTWARE.
|
| 29 |
+
```
|
| 30 |
+
|
| 31 |
+
The game, emulator, external agents, and replay datasets are separate inputs governed by their respective providers' terms.
|
card-architecture.png
CHANGED
|
Git LFS Details
|
|
Git LFS Details
|
card-evaluation.json
CHANGED
|
@@ -29,14 +29,11 @@
|
|
| 29 |
"winner_weighted_validation_nll": 0.72489
|
| 30 |
}
|
| 31 |
],
|
| 32 |
-
"source": "Section 5.1, Initial Benchmark Suite
|
| 33 |
"sampling_seeds_shared": true,
|
| 34 |
"emulator_starting_rng_fully_controlled": false,
|
| 35 |
-
"
|
| 36 |
-
|
| 37 |
-
"75M": 7,
|
| 38 |
-
"total": 20
|
| 39 |
-
}
|
| 40 |
},
|
| 41 |
"expanded_suite": {
|
| 42 |
"games_per_arena_policy": 1312,
|
|
@@ -58,7 +55,7 @@
|
|
| 58 |
"75M_wins": 503
|
| 59 |
}
|
| 60 |
},
|
| 61 |
-
"source": "Sections 5.2, Final Benchmark After Reinforcement Learning
|
| 62 |
"faynt_added_delay_frames": 0,
|
| 63 |
"opponent_delay_frames": [
|
| 64 |
21,
|
|
@@ -74,7 +71,7 @@
|
|
| 74 |
"10M_Arena_wins": 68,
|
| 75 |
"75M_Arena_wins": 58,
|
| 76 |
"10M_Arena_four_stock_wins": 61,
|
| 77 |
-
"source": "Sections 5.4, Zero-Delay Comparisons
|
| 78 |
},
|
| 79 |
"phillip_final_destination": {
|
| 80 |
"games": 112,
|
|
@@ -86,7 +83,7 @@
|
|
| 86 |
"10M_wins": 126,
|
| 87 |
"75M_wins": 126
|
| 88 |
},
|
| 89 |
-
"source": "Section 5.4, Zero-Delay Comparisons
|
| 90 |
"phillip_action_repeat_frames": [
|
| 91 |
2,
|
| 92 |
3,
|
|
@@ -101,11 +98,24 @@
|
|
| 101 |
"Forced mirrors use characters outside the opponent deployed roster.",
|
| 102 |
"Additional-character expanded cells outside the opponent deployed roster have two games; supported specialist mirrors have 12 games each."
|
| 103 |
],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 104 |
"benchmark_actor": {
|
| 105 |
-
"context_frames":
|
| 106 |
"context_mode": "ring",
|
| 107 |
"added_policy_delay_frames": 0,
|
| 108 |
-
"action_sampling_temperature": 1.0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 109 |
},
|
| 110 |
"checkpoint_source_sha256": "c8a810c0d33b72ae448eec0e0b7d0538beacfaeb9a2e357eddd7be4fc0ce286b"
|
| 111 |
}
|
|
|
|
| 29 |
"winner_weighted_validation_nll": 0.72489
|
| 30 |
}
|
| 31 |
],
|
| 32 |
+
"source": "Section 5.1, Initial Benchmark Suite, Figure 8; Appendix F.2, The Original 152-Game Panel, F.3, Execution, Scoring, and Reuse, and F.7, Fixed-Panel Win and Stock Ledgers; Appendix E.4, Selected Checkpoints and Slice Diagnostics, Tables E.7 and E.8",
|
| 33 |
"sampling_seeds_shared": true,
|
| 34 |
"emulator_starting_rng_fully_controlled": false,
|
| 35 |
+
"fidelity_audit_status": "complete",
|
| 36 |
+
"verified_outcomes_per_policy": 152
|
|
|
|
|
|
|
|
|
|
| 37 |
},
|
| 38 |
"expanded_suite": {
|
| 39 |
"games_per_arena_policy": 1312,
|
|
|
|
| 55 |
"75M_wins": 503
|
| 56 |
}
|
| 57 |
},
|
| 58 |
+
"source": "Sections 5.2, Final Benchmark After Reinforcement Learning, and 5.3, Supported-Character and Full-Roster Performance, Figure 9; Appendix F.5, Expanded Slippi-AI Panel, Table F.5, F.8, Supported-Character Mirrors, F.9, Extended-Roster Matches, and F.10, Forced-Character Mirrors",
|
| 59 |
"faynt_added_delay_frames": 0,
|
| 60 |
"opponent_delay_frames": [
|
| 61 |
21,
|
|
|
|
| 71 |
"10M_Arena_wins": 68,
|
| 72 |
"75M_Arena_wins": 58,
|
| 73 |
"10M_Arena_four_stock_wins": 61,
|
| 74 |
+
"source": "Sections 5.4, Zero-Delay Comparisons, and 6.5, From Supervised Post-Training to Reinforcement Learning, Figure 15; Appendix F.13, Privately Supplied Zero-Delay Slippi-AI Checkpoint, Table F.8"
|
| 75 |
},
|
| 76 |
"phillip_final_destination": {
|
| 77 |
"games": 112,
|
|
|
|
| 83 |
"10M_wins": 126,
|
| 84 |
"75M_wins": 126
|
| 85 |
},
|
| 86 |
+
"source": "Section 5.4, Zero-Delay Comparisons; Appendix F.12, Zero-Delay Specialist Evaluation, Table F.7, and F.13, Privately Supplied Zero-Delay Slippi-AI Checkpoint, Table F.8",
|
| 87 |
"phillip_action_repeat_frames": [
|
| 88 |
2,
|
| 89 |
3,
|
|
|
|
| 98 |
"Forced mirrors use characters outside the opponent deployed roster.",
|
| 99 |
"Additional-character expanded cells outside the opponent deployed roster have two games; supported specialist mirrors have 12 games each."
|
| 100 |
],
|
| 101 |
+
"behavior_analysis": {
|
| 102 |
+
"cohort_games": {
|
| 103 |
+
"10M": 139,
|
| 104 |
+
"75M": 145
|
| 105 |
+
},
|
| 106 |
+
"scope": "Frozen matched Base-to-Expert analysis cohorts; all152initial-panel outcomes are verified.",
|
| 107 |
+
"source": "Appendix G.1, Replay Selection and Evaluation Conditions; Tables G.1-G.4"
|
| 108 |
+
},
|
| 109 |
"benchmark_actor": {
|
| 110 |
+
"context_frames": 256,
|
| 111 |
"context_mode": "ring",
|
| 112 |
"added_policy_delay_frames": 0,
|
| 113 |
+
"action_sampling_temperature": 1.0,
|
| 114 |
+
"cache_behavior": "Continuous native key/value ring; capacity comes from model_config.context_length."
|
| 115 |
+
},
|
| 116 |
+
"actor_trajectory_context": {
|
| 117 |
+
"frames": 128,
|
| 118 |
+
"meaning": "Actor trajectory/history configuration, separate from the 256-frame native ring-cache capacity."
|
| 119 |
},
|
| 120 |
"checkpoint_source_sha256": "c8a810c0d33b72ae448eec0e0b7d0538beacfaeb9a2e357eddd7be4fc0ce286b"
|
| 121 |
}
|
card-hero.png
CHANGED
|
|
config.json
CHANGED
|
@@ -80,84 +80,89 @@
|
|
| 80 |
"num_hidden_layers": 5,
|
| 81 |
"num_key_value_heads": 2,
|
| 82 |
"provenance": {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 83 |
"architecture": {
|
| 84 |
-
"
|
| 85 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 86 |
"controller_vocab_sizes": {
|
| 87 |
"buttons": 728,
|
| 88 |
"main_stick": 85
|
| 89 |
},
|
| 90 |
-
"
|
| 91 |
-
"head_dim": 64,
|
| 92 |
-
"hidden_size": 384,
|
| 93 |
-
"intermediate_size": 768,
|
| 94 |
-
"normalization": "RMSNorm",
|
| 95 |
-
"num_attention_heads": 6,
|
| 96 |
-
"num_hidden_layers": 5,
|
| 97 |
-
"num_key_value_heads": 2,
|
| 98 |
-
"parameter_count": 10163629,
|
| 99 |
"position_encoding": "rope",
|
| 100 |
-
"qk_norm": true,
|
| 101 |
"residual_mode": "full_attnres",
|
| 102 |
-
"
|
| 103 |
-
"
|
| 104 |
-
|
| 105 |
-
|
| 106 |
-
"action_sampling_temperature": 1.0,
|
| 107 |
-
"added_policy_delay_frames": 0,
|
| 108 |
-
"context_frames": 128,
|
| 109 |
-
"context_mode": "ring"
|
| 110 |
},
|
| 111 |
-
"
|
| 112 |
-
"
|
| 113 |
-
"
|
| 114 |
-
"
|
| 115 |
-
"
|
| 116 |
-
"
|
|
|
|
| 117 |
},
|
| 118 |
"inference_package": {
|
|
|
|
| 119 |
"config_file": "config.json",
|
| 120 |
"loading_api": "transformers.AutoModel.from_pretrained",
|
| 121 |
-
"preserve_original_policy_tensor_values": true,
|
| 122 |
"trust_remote_code": true,
|
| 123 |
-
"
|
| 124 |
},
|
| 125 |
-
"
|
| 126 |
-
"
|
| 127 |
-
"
|
| 128 |
-
"
|
| 129 |
-
"
|
| 130 |
-
"
|
| 131 |
-
"slippi_ai_revision": "577965a7731dc53e3472ea63d9e9853a4e9d65fa"
|
| 132 |
},
|
| 133 |
-
"model_name": "Faynt-10M-Arena",
|
| 134 |
-
"repository_id": "frisson-labs/Faynt-10M-Arena",
|
| 135 |
-
"schema_version": "faynt.public_checkpoint_provenance.v1",
|
| 136 |
"selected_rl_lineage_steps": 1950,
|
| 137 |
-
"
|
| 138 |
-
|
| 139 |
-
"
|
| 140 |
-
"
|
| 141 |
-
"
|
| 142 |
-
"
|
| 143 |
},
|
| 144 |
-
"
|
| 145 |
-
|
| 146 |
-
|
| 147 |
-
|
| 148 |
-
"stage": "expert"
|
| 149 |
-
},
|
| 150 |
-
{
|
| 151 |
-
"selected_step": 1318,
|
| 152 |
-
"stage": "reinforcement_learning_run_1"
|
| 153 |
-
},
|
| 154 |
-
{
|
| 155 |
-
"reference_kl_forward": 0.003,
|
| 156 |
-
"reference_kl_reverse": 0.003,
|
| 157 |
-
"selected_step": 632,
|
| 158 |
-
"stage": "reinforcement_learning_run_2"
|
| 159 |
-
}
|
| 160 |
-
]
|
| 161 |
},
|
| 162 |
"tie_word_embeddings": false,
|
| 163 |
"training_stage": "arena",
|
|
|
|
| 80 |
"num_hidden_layers": 5,
|
| 81 |
"num_key_value_heads": 2,
|
| 82 |
"provenance": {
|
| 83 |
+
"schema_version": "faynt.public_checkpoint_provenance.v1",
|
| 84 |
+
"model_name": "Faynt-10M-Arena",
|
| 85 |
+
"repository_id": "frisson-labs/Faynt-10M-Arena",
|
| 86 |
+
"stage": "arena",
|
| 87 |
+
"selected_step": 632,
|
| 88 |
+
"source_artifact": {
|
| 89 |
+
"filename": "checkpoint.pt",
|
| 90 |
+
"sha256": "c8a810c0d33b72ae448eec0e0b7d0538beacfaeb9a2e357eddd7be4fc0ce286b",
|
| 91 |
+
"bytes": 40698232,
|
| 92 |
+
"packaging": "policy_export"
|
| 93 |
+
},
|
| 94 |
+
"training_lineage": [
|
| 95 |
+
{
|
| 96 |
+
"stage": "expert",
|
| 97 |
+
"selected_step": 195248
|
| 98 |
+
},
|
| 99 |
+
{
|
| 100 |
+
"stage": "reinforcement_learning_run_1",
|
| 101 |
+
"selected_step": 1318
|
| 102 |
+
},
|
| 103 |
+
{
|
| 104 |
+
"stage": "reinforcement_learning_run_2",
|
| 105 |
+
"selected_step": 632,
|
| 106 |
+
"reference_kl_forward": 0.003,
|
| 107 |
+
"reference_kl_reverse": 0.003
|
| 108 |
+
}
|
| 109 |
+
],
|
| 110 |
"architecture": {
|
| 111 |
+
"parameter_count": 10163629,
|
| 112 |
+
"hidden_size": 384,
|
| 113 |
+
"num_hidden_layers": 5,
|
| 114 |
+
"num_attention_heads": 6,
|
| 115 |
+
"num_key_value_heads": 2,
|
| 116 |
+
"head_dim": 64,
|
| 117 |
+
"intermediate_size": 768,
|
| 118 |
+
"training_context_frames": 256,
|
| 119 |
+
"frame_encoder_features": 2091,
|
| 120 |
"controller_vocab_sizes": {
|
| 121 |
"buttons": 728,
|
| 122 |
"main_stick": 85
|
| 123 |
},
|
| 124 |
+
"source_parameter_dtype": "float32",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 125 |
"position_encoding": "rope",
|
|
|
|
| 126 |
"residual_mode": "full_attnres",
|
| 127 |
+
"attention_output_gate": "elementwise_sigmoid",
|
| 128 |
+
"qk_norm": true,
|
| 129 |
+
"normalization": "RMSNorm",
|
| 130 |
+
"activation": "SwiGLU"
|
|
|
|
|
|
|
|
|
|
|
|
|
| 131 |
},
|
| 132 |
+
"input_contract": {
|
| 133 |
+
"representation": "structured Slippi-AI game state and current controller",
|
| 134 |
+
"slippi_ai_revision": "577965a7731dc53e3472ea63d9e9853a4e9d65fa",
|
| 135 |
+
"codec": "custom_v1",
|
| 136 |
+
"character_count": 26,
|
| 137 |
+
"action_offset_frames": 1,
|
| 138 |
+
"added_policy_delay_frames": 0
|
| 139 |
},
|
| 140 |
"inference_package": {
|
| 141 |
+
"weights_file": "model.safetensors",
|
| 142 |
"config_file": "config.json",
|
| 143 |
"loading_api": "transformers.AutoModel.from_pretrained",
|
|
|
|
| 144 |
"trust_remote_code": true,
|
| 145 |
+
"preserve_original_policy_tensor_values": true
|
| 146 |
},
|
| 147 |
+
"evidence": {
|
| 148 |
+
"original_checkpoint_sha256_verified": true,
|
| 149 |
+
"native_step_and_model_metadata_verified": true,
|
| 150 |
+
"paper": "Faynt: Scaling and Optimizing Policies for Competitive Melee",
|
| 151 |
+
"paper_revision_date": "2026-09-28",
|
| 152 |
+
"policy_tensors_equal_evaluated_benchmark_wrapper": true
|
|
|
|
| 153 |
},
|
|
|
|
|
|
|
|
|
|
| 154 |
"selected_rl_lineage_steps": 1950,
|
| 155 |
+
"benchmark_actor": {
|
| 156 |
+
"context_frames": 256,
|
| 157 |
+
"context_mode": "ring",
|
| 158 |
+
"added_policy_delay_frames": 0,
|
| 159 |
+
"action_sampling_temperature": 1.0,
|
| 160 |
+
"cache_behavior": "Continuous native key/value ring; capacity comes from model_config.context_length."
|
| 161 |
},
|
| 162 |
+
"actor_trajectory_context": {
|
| 163 |
+
"frames": 128,
|
| 164 |
+
"meaning": "Actor trajectory/history configuration, separate from the 256-frame native ring-cache capacity."
|
| 165 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 166 |
},
|
| 167 |
"tie_word_embeddings": false,
|
| 168 |
"training_stage": "arena",
|
provenance.json
CHANGED
|
@@ -72,9 +72,14 @@
|
|
| 72 |
},
|
| 73 |
"selected_rl_lineage_steps": 1950,
|
| 74 |
"benchmark_actor": {
|
| 75 |
-
"context_frames":
|
| 76 |
"context_mode": "ring",
|
| 77 |
"added_policy_delay_frames": 0,
|
| 78 |
-
"action_sampling_temperature": 1.0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 79 |
}
|
| 80 |
}
|
|
|
|
| 72 |
},
|
| 73 |
"selected_rl_lineage_steps": 1950,
|
| 74 |
"benchmark_actor": {
|
| 75 |
+
"context_frames": 256,
|
| 76 |
"context_mode": "ring",
|
| 77 |
"added_policy_delay_frames": 0,
|
| 78 |
+
"action_sampling_temperature": 1.0,
|
| 79 |
+
"cache_behavior": "Continuous native key/value ring; capacity comes from model_config.context_length."
|
| 80 |
+
},
|
| 81 |
+
"actor_trajectory_context": {
|
| 82 |
+
"frames": 128,
|
| 83 |
+
"meaning": "Actor trajectory/history configuration, separate from the 256-frame native ring-cache capacity."
|
| 84 |
}
|
| 85 |
}
|