{"article":{"slug":"welcome-beam-a-501b-open-model-you-can-own-customize-and-scale","title":"Welcome Beam: a 501B open model you can own, customize, and scale","subtitle":null,"summary":"context window of 1M tokens, and is released under the Apache 2.0 license. Beam is focused on coding and agentic use cases. It is for teams that want a frontier-scale model on their own hardware, infrastructure, or cloud, and want to customize it to their own use cases. Beam ships with its own dedicated open source Rust based harness that delivers the best performance from the model.","content_type":"announcement","language":"en","canonical_url":"https://huggingface.co/blog/reflection-beam","author":{"name":"Ben Burtenshaw, Merve, Pedro Cuenca","url":null,"person_slug":null,"person_url":null},"authored_by":"human","publisher":{"name":"Hugging Face","url":"https://huggingface.co","listing_slug":"hugging-face","listing":{"slug":"hugging-face","name":"Hugging Face","listing_type":"company","url":"https://listedstartups.com/companies/hugging-face"}},"topics":[{"name":"AI","slug":"ai","url":"https://listedarticles.com/topics/ai"},{"name":"Open Source","slug":"open-source","url":"https://listedarticles.com/topics/open-source"},{"name":"LLMs","slug":"llms","url":"https://listedarticles.com/topics/llms"},{"name":"Machine Learning","slug":"machine-learning","url":"https://listedarticles.com/topics/machine-learning"}],"about_listings":[],"cover_image_url":null,"license":"all-rights-reserved","word_count":4113,"reading_minutes":18,"published_at":"2026-10-16T00:00:00.000Z","added_at":"2026-10-16T14:22:03.514Z","updated_at":"2026-10-16T14:22:03.514Z","added_via":"api","contributor":{"type":"agent","name":"ListedStartups Using Bot","registered":true},"profile_url":"https://listedarticles.com/articles/welcome-beam-a-501b-open-model-you-can-own-customize-and-scale","markdown_url":"https://listedarticles.com/articles/welcome-beam-a-501b-open-model-you-can-own-customize-and-scale.md","example":false,"citation":"Ben Burtenshaw, Merve, Pedro Cuenca, Hugging Face. \"Welcome Beam: a 501B open model you can own, customize, and scale.\" 16 Oct 2026. https://huggingface.co/blog/reflection-beam (all-rights-reserved)","access":{"human_view":"preview","full_text_available":true,"source_url":"https://huggingface.co/blog/reflection-beam"},"body_markdown":"# Welcome Beam: a 501B open model you can own, customize, and scale\n\n**context window of 1M tokens**, and is released under the Apache 2.0 license.\n\nBeam is focused on *coding* and *agentic* use cases. It is for teams that want a frontier-scale model on their own hardware, infrastructure, or cloud, and want to customize it to their own use cases. Beam ships with its own dedicated open source Rust based harness that delivers the best performance from the model.\n\nBeam has a native transformers implementation, as well as downstream libraries like vLLM and SGLang. We’ve worked with the Reflection team to bring you inference, SFT (supervised fine tuning), and RL (reinforcement learning) recipes for you to build with this model for your needs. On top of day-0 support in transformers, SGLang and vLLM, this post shows you how to run it, how to post-train it, and what we built with it.\n\n**TL;DR**\n\n\n- 501B-parameter MoEs LLM with 23B active per token. 52 layers, 256 experts per MoE layer, 8 routed per token.\n- Text in, text out with\n**context window of 1M tokens.**- Checkpoint formats:\n**BF16****, FP8,** and **NVFP4**- Reasoning that can stay in context across turns (\n`preserve_thinking`), tool calling with a dedicated grammar. The model supports five reasoning values: \"low\", \"medium\" (default), \"high\", \"xhigh\", and \"max\".- Response template in the tokenizer.\n- Speculative decoding drafter model with DFlash2\n- Day-0 libraries: transformers, SGLang, vLLM. Full-parameter RL with Miles.\n- Ships with a Rust-based custom harness.\n- Apache 2.0.\n\n## Build with Beam\n\nReflection is going to give out $10,000 Hub credits to the best projects that use Beam. All you have to do is make a thing, and share it on the Hub:\n\n- You could make a demo that uses the Beam model on Spaces\n- You could quantize it for your favorite hardware\n- You could generate a synthetic dataset for your favorite problem\n- You could build an RL environment with or for Beam\n- You could benchmark Beam and share the results.\n- You could surprise us!\n\nIf you build something with Beam, then share it on the Hub for a chance to win $10,000. All you have to do is build the space, model, or dataset repo and share it on the model’s repo page. We’ll collect all the links, select the best, and send out the credits to your Hub accounts.\n\n## What is Beam?\n\nBeam is a text-only model built for long-context (1M context length) reasoning and agentic work. It is a sparse MoE model, where each token is computed by a small fraction of the network, so it runs at the speed of a much smaller model while keeping the capacity of a large one.\n\n### Attention\n\nThe decoder has 52 layers with a hidden size of 5,120. Most layers use sliding-window attention over the previous 512 tokens; every sixth layer, and the last one, attend to the full context. That gives 43 sliding-window layers and 9 global ones.\n\n*Inside the attention block (both layer types)*\n\nThe two kinds of layers handle position differently. Sliding-window layers use RoPE, since relative position matters most within a short window. **Global layers use no positional encoding**. Instead, each query is multiplied by a scaler that grows slowly with the number of visible tokens, `(1 + (pos + 1) / 2048) ** 0.1`. It acts as a temperature: the softmax keeps its precision as the context lengthens instead of flattening out. The implementation calls this scalable-softmax query scaling.\n\nAttention uses grouped-query attention with 48 query heads and 8 key-value heads, with RMSNorm on queries and keys. A learned sigmoid gate, computed from the layer input, scales every channel of every head before the output projection.\n\n### Mixture of Experts\n\nThe first 3 layers use a dense SwiGLU MLP. The other 49 replace it with a Mixture-of-Experts block of 256 experts, each a SwiGLU MLP with an intermediate size of 2,560, or about 39M parameters. The experts hold 98.4% of the model's parameters.\n\nThe router follows DeepSeek-V3's group-limited scheme. It scores all 256 experts with a sigmoid, splits them into 8 groups of 32, keeps the 4 best groups (ranked by the sum of each group's top two scores), then picks the top 8 experts inside them. Beam uses the same group sizes as DeepSeek-V3 but no shared expert. Expert outputs are combined with normalized router weights and scaled by 2.5.\n\nOnly 8 experts run per token, so the model computes each token with about 23B parameters. All 256 experts stay in memory, so deployment needs the memory of a 501B model but runs at the speed of a 23B one. The BF16 checkpoint is about 1 TB in safetensors format. The NVFP4 checkpoint stores most parameters in 4-bit precision for NVIDIA Blackwell GPUs, some parameters are kept in BF16 for accuracy. There are also FP8 checkpoints on the hub which are ideal for Hopper and Ampere series chips.\n\nIf you want to deploy Beam yourself, check out the vLLM or SGLang recipes below.\n\n### Residual Stream\n\nThe residual connections are the most distinctive part. A standard transformer adds each sublayer output to the stream with weight 1, so the stream grows with depth.\n\nBeam counts the input embedding as step 1. At step `k` it adds the sublayer output with weight `1/sqrt(k)` and keeps the existing stream with weight `sqrt((k-1)/k)`. The squares of the two weights sum to one, so the stream stays at a constant scale from the first layer to the last. After all 104 additions, every sublayer output and the input embedding carry the same weight in the final hidden state.\n\nEvery sublayer is also normalized before and after, and the final logits pass through a tanh softcap at ±30, computed in FP32. The implementation fixes where it computes in FP32: the router, the SwiGLU product, the norms, RoPE, the query scaling and the softcap.\n\n### Long Context\n\nHybrid attention works well for long contexts. Each layer caches 2 x 8 KV heads x 128 dims = 2,048 values per token. If all 52 layers kept every token, the cache would grow by 208 KiB per token. Only the 9 global layers keep the whole sequence. The 43 sliding-window layers hold a fixed 512-token window each and stop growing. So the cache grows by 36 KiB per token, roughly a sixth of the naive rate.\n\n| Context | If all 52 layers were global | Beam | \n|---|---|---|\n| 32K tokens | 6.5 GiB | 1.2 GiB | \n| 128K tokens | 26 GiB | 4.6 GiB | \n| Full context (1M) | 208 GiB | **36.08 GiB** | \n\nThese numbers are per sequence, in BF16, with the transformers dynamic cache.\n\n## Benchmark Results\n\nHere are the benchmark results across different precision levels, as provided by the Reflection team.\n\n|  | *Beam (BF16)* | *Beam (FP8)* | *Beam (NVFP4)* | \n|---|---|---|---|\n| **Agentic Coding / Terminal** |  |  |  | \n| DeepSWE v1.1 | 43.3% | 43.0% | 42.7% | \n| SWE Bench Pro v2-Hard | 76.5% | 78.4% | 78.6% | \n| SWE Bench Pro v1 | 66.1% | 65.9% | 65.6% | \n| Terminal Bench v2.1 | 80.1% | 78.9% | 78.2% | \n| SWE Atlas Codebase QnA | 31.8% | 32.2% | 31.4% | \n| SWEBench Multilingual | 78.3% | 78.1% | 77.5% | \n| SWEBench Verified | 81.6% | 80.2% | 80.7% | \n| **Reasoning** |  |  |  | \n| AIME 2026 | 97.7% | 98.0% | 97.5% | \n| HLE (no tools) | 36.0% | 36.0% | 34.8% | \n| HLE (with tools) | 51.1% | 51.1% | 51.1% | \n| SciCode | 49.2% | 48.3% | 46.9% | \n| CriPT AA | 16.3% | 17.4% | 15.4% | \n| GPQA Diamond | 90.6% | 90.3% | 89.3% | \n| LiveCodeBench | 88.3% | 88.1% | 87.4% | \n| **Tool Calling / Search** |  |  |  | \n| AutomationBench - public split only | 39.3 | 38.2 | 39.8% | \n| MCP Atlas | 80.8% | 81.5% | 80.5% | \n| Tau3 Banking | 36.1% | 36.8% | 35.4% | \n| BrowseComp w/ context management | 76.8% | 76.7% | 75.6% | \n| DeepSearchQA w/ context management | 80.5% | 79.6% | 81.1% | \n| **General Capabilities** |  |  |  | \n| AA-LCR | 78.2% | 79.4% | 78.7% | \n| LongBench v2 | 67.5% | 67.6% | 67.2% | \n| IFBench | 79.6% | 80.7% | 79.2% | \n| AA Omniscience (index) - public split only | 10.8 | 8.8 | 9.8 | \n\n## Hardware Requirements\n\nThe most practical way to serve the model is serving the NVFP4 checkpoint, which retains most of the quality of the bf16 checkpoint. NVFP4 stores some weights in 4 bits, and this way, it shrinks the 501B parameters in BF16 from 1 TB to ~280 GB. Blackwell GPUs run NVFP4 natively but GPUs older than Blackwell like the H200 can't. The FP8 checkpoints are suitable for GPUs older than Blackwell.\n\nA B200 has 180 GB of HBM3e, so two of them (360 GB) can hold the Beam weights, with little room left for activations and the KV cache. Plan for four B200s (720 GB), which leaves plenty of room for long contexts and concurrent requests. You can also serve it on a full 8xB200 node, or on two B300s at 288 GB each, or even 8xRTX Pro 6000. If you don't have Blackwell hardware, use Inference Providers (serverless) to test Reflection.\n\n## Inference Support\n\nBeam comes with day-0 support in transformers, SGLang and vLLM.\n\n### Transformers\n\nInstall the latest version of transformers.\n\n```\npip install -U \"transformers>=5.20.1\"\n```\nThe easiest way to run Beam is the text-generation pipeline:\n\n```\nfrom transformers import pipeline\npipe = pipeline(\n    \"text-generation\", model=\"reflection/Beam-1.0-501B-A23B\", device_map=\"auto\"\n)\nmessages = [\n    {\"role\": \"user\", \"content\": \"Write a limerick about Python exceptions.\"}\n]\noutput = pipe(messages, max_new_tokens=2000)\noutput[0][\"generated_text\"][-1]\n```\nThe pipeline returns the whole chat. The last message is Beam's reply, already parsed by the response template.\n\nGoing one level lower, use `AutoModelForCausalLM` and `AutoTokenizer`.\n\n```\nfrom transformers import AutoModelForCausalLM, AutoTokenizer\nmodel_id = \"reflection/Beam-1.0-501B-A23B\"\ntokenizer = AutoTokenizer.from_pretrained(model_id)\nmodel = AutoModelForCausalLM.from_pretrained(\n    model_id, dtype=\"auto\", device_map=\"auto\"\n)\n```\n#### Chat\n\n```\nmessages = [\n    {\"role\": \"system\", \"content\": \"You should only answer with a number.\"},\n    {\"role\": \"user\", \"content\": \"What is 17 * 23?\"},\n]\ninputs = tokenizer.apply_chat_template(\n    messages,\n    add_generation_prompt=True,\n    tokenize=True,\n    return_dict=True,\n    return_tensors=\"pt\",\n    reasoning_effort=\"medium\" # by default\n).to(model.device)\ninput_len = inputs[\"input_ids\"].shape[-1]\noutputs = model.generate(**inputs, max_new_tokens=2000)\ntokenizer.parse_response(\n    outputs[0][input_len:], prefix=inputs[\"input_ids\"][0]\n)\n```\nBeam's tokenizer carries a response template. `parse_response` reads it and turns the raw output into a message dict, with the reasoning, the answer, and any tool calls in separate fields. This avoids the usual regex for splitting reasoning from answers from tool calls. And the rules ship with the tokenizer, so the parsed structure matches what Beam was trained to produce. The chat template can pre-write part of the assistant turn, which the parser needs to see.\n\n#### Tool calling\n\n## Complete tool-calling example\n\n```\ndef get_weather(city: str, unit: str = \"celsius\"):\n    \"\"\"\n    Get the current weather for a city.\n    Args:\n        city: The city to look up.\n        unit: Temperature unit, \"celsius\" or \"fahrenheit\".\n    \"\"\"\n    ...\ntools = [get_weather]\nmessages = [\n    {\"role\": \"user\", \"content\": \"I land in Paris tonight. Do I need a coat?\"}\n]\ninputs = tokenizer.apply_chat_template(\n    messages,\n    tools=tools,\n    add_generation_prompt=True,\n    tokenize=True,\n    return_dict=True,\n    return_tensors=\"pt\",\n).to(model.device)\ninput_len = inputs[\"input_ids\"].shape[-1]\noutputs = model.generate(**inputs, max_new_tokens=1000)\nmessage = tokenizer.parse_response(\n    outputs[0][input_len:], prefix=inputs[\"input_ids\"][0], tools=tools\n)\nmessage.get(\"tool_calls\")\n```\nPass `tools` to `parse_response` as well. Beam writes tool-call arguments inline, in its own XML-style grammar, so a bare `7` could be a number or a string. With the tool schemas, the parser casts each argument to its declared type.\n\n#### Multi-GPU and multi-node\n\nBeam's config defines an expert-parallel plan. Expert parallelism puts each expert on one device. Attention, the dense layers, the embeddings and the LM head are replicated on every device. That is 8B parameters, or 16 GB in BF16. Load the model with a `DistributedConfig`:\n\n```\nimport os\nfrom transformers import AutoModelForCausalLM\nfrom transformers.distributed import DistributedConfig\nmodel = AutoModelForCausalLM.from_pretrained(\n    \"reflection/Beam-1.0-501B-A23B\",\n    distributed_config=DistributedConfig(\n        tp_size=int(os.environ[\"WORLD_SIZE\"]), ep_size=int(os.environ[\"WORLD_SIZE\"]), tp_plan={}\n    ),\n)\n```\nLaunch the script with `torchrun` across 16 H200 GPUs. Each one then holds 78 GB of weights. With 8 GPUs each would hold 139 GB, which leaves no room on a 141 GB H200. The number of devices must divide the number of experts, 256.\n\n### vLLM\n\nBeam has day-0 support in vLLM. The command below serves the BF16 checkpoint with tensor parallelism across 16 GPUs (two 8x H200 nodes) and exposes an OpenAI-compatible API:\n\n```\nvllm serve reflection/Beam-1.0-501B-A23B --tensor-parallel-size 16 --served-model-name beam\n```\nFor faster generation, add DFlash2 speculative decoding. A small drafter model proposes up to 15 tokens ahead, and Beam checks them all in one forward pass, so each step can accept several tokens. The cost is a little extra memory for the drafter:\n\n```\nvllm serve reflection/Beam-1.0-501B-A23B \\\n  --tensor-parallel-size 16 \\\n  --speculative-config '{ \"method\": \"dflash\", \"model\": \"reflection/dflash2-drafter-preview\", \"num_speculative_tokens\": 15 }'\n```\nBoth commands start an OpenAI-compatible server, so you can point any OpenAI client at `http://localhost:8000/v1`. For additional serving configurations, see the proposed Beam recipe for vLLM.\n\n### SGLang\n\nBeam also has day-0 support in SGLang. We recommend serving it with DFlash2 speculative decoding, which both commands below turn on. On Blackwell, the NVFP4 checkpoint fits on 4 B300s:\n\n```\npython -m sglang.launch_server \\\n--model-path reflection/Beam-1.0-501B-A23B-NVFP4 \\\n--served-model-name beam \\\n--tp 4 \\\n--attention-backend trtllm_mha \\\n--page-size 64 \\\n--context-length 1048576 \\\n--mem-fraction-static 0.85 \\\n--enable-unified-memory \\\n--speculative-algorithm DFLASH \\\n--speculative-draft-model-path reflection/Beam-1.0-501B-A23B-DFlash2 \\\n--speculative-dflash-block-size 8 \\\n--tool-call-parser beam --reasoning-parser beam \\\n--host 0.0.0.0 --port 30000\n```\nOn Hopper GPUs, use the FP8 checkpoint on 8 H200s instead. Only three flags change: the checkpoint, the tensor-parallel size (8 instead of 4), and the attention backend (fa3 instead of trtllm_mha, which needs Blackwell):\n\n```\npython -m sglang.launch_server \\\n--model-path reflection/Beam-1.0-501B-A23B-FP8 \\\n--served-model-name beam \\\n--tp 8 \\\n--attention-backend fa3 \\\n--page-size 64 \\\n--context-length 1048576 \\\n--mem-fraction-static 0.85 \\\n--enable-unified-memory \\\n--speculative-algorithm DFLASH \\\n--speculative-draft-model-path reflection/Beam-1.0-501B-A23B-DFlash2 \\\n--speculative-dflash-block-size 8 \\\n--tool-call-parser beam --reasoning-parser beam \\\n--host 0.0.0.0 --port 30000\n```\n### Inference Providers\n\nBeam is available on Hugging Face Inference Providers, powered by Baseten, Fireworks, and Together, with more to follow soon.\n\n```\nimport os\nfrom openai import OpenAI\nclient = OpenAI(\n    base_url=\"https://router.huggingface.co/v1\",\n    api_key=os.environ[\"HF_TOKEN\"],\n)\ncompletion = client.chat.completions.create(\n    model=\"reflection/Beam-1.0-501B-A23B:auto\",\n    messages=[{\"role\": \"user\", \"content\": \"What is the capital of France?\"}],\n)\nprint(completion.choices[0].message)\n```\n### Inference Endpoints\n\nWe’ve set up a Beam recipe for you to one click deploy in Inference Endpoints from the catalog in FP8 or NVFP4, or install with the `hf` cli like so:\n\n```\nhf endpoints catalog deploy --repo reflection/Beam-1.0-501B-A23B --name beam\n```\n## What we tested\n\nWe are sharing some vibe evals of Reflection Beam-501B-A23B on five tasks, once each at low and high reasoning effort through the Reflection platform. These are vibe evals, not benchmarks. If you’re planning on using Beam, this is a great way to kick the tires and see how it behaves on specific use cases, and importantly, where it wins and loses.\n\nBelow is an overview of the prompts we ran and the output traces from the hub. The complete inputs, outputs, API usage, task fixtures, graders and conversation traces are in this public Hugging Face bucket.\n\n| Category | Prompt Description | Low reasoning (tokens) | High reasoning (tokens) | \n|---|---|---|---|\n| Multi-step tool calling | Fulfill ORD-742: compare stock, reservations, surcharges and arrival dates; reserve the cheapest eligible warehouse. | ✅ 544 | ✅ 811 | \n| Long-context retrieval over a code base | Derive Click command configuration and two invocation results from three complete source files; cite six implementation symbols. | 🔴 1,613 * | ✅ 5,007 | \n| Terminal task in a sandbox | Inspect and repair a CSV ledger CLI; fix all bugs, preserve tests, run tests and a CLI check. | ✅ 582 | ✅ 1,548 | \n| Math reasoning (AIME-style) | How many eight-element subsets of {1, …, 16} have a sum divisible by 17? Give a justification. | 🟠 829 † | ✅ 2,809 | \n| Structured output | Convert an out-of-order revision log into strict JSON: merge patches, cancellations, nulls, dates, currencies and totals. | ✅ 1,040 | ✅ 2,088 | \n\n** Low's long-context response got all code behavior and all six source citations correct. However, the response did not correspond to the parsers format, so this is partly prompt ambiguity.*\n\n† Low returned the correct answer, but omitted the requested justification. High supplied a correct roots-of-unity proof, independently reviewed.\n\nDon’t take our word for it. Dig into the bucket, rewrite for your use case or project and push Beam to the limit.\n\n## Post-training Beam\n\nYou can fine tune Beam for your own use cases. Here, we share some examples in TRL and Miles to get you started on supervised fine-tuning and reinforcement learning.\n\n### SFT with TRL\n\nThe quickest way to adapt Beam to your own data is supervised fine-tuning with TRL's SFTTrainer. To keep memory manageable, we train LoRA adapters with PEFT rather than updating all 501B parameters:\nWe used TRL’s `SFTTrainer` to adapt Beam to a simple goal: keep its reasoning in the language requested by the user. We fine-tuned on Multilingual-Thinking with LoRA, which trains a small set of adapter weights while keeping the base model frozen.\n\nThe setup combines model sharding at load time, expert parallelism, FlashAttention 4 and sequence packing. LoRA SFT fits on a single node with 8 B300 GPUs, reaching around 19,000 tokens per second. The corresponding H100 setup uses four nodes.\n\nAfter one epoch of Multilingual-Thinking, Beam reasoned in the requested language on 16 out of 16 held-out prompts, compared with 3 out of 16 for the base model. This small evaluation measures language adherence, rather than the correctness of the reasoning itself.\n\n*Training loss (left) and mean token accuracy (right) during a separate 500-step run on a reasoning subset of open-r1/Mixture-of-Thought, using one 8-GPU B300 node. These training metrics are from the official TRL example PR.*\n\n### GRPO with Miles\n\nReflection and RadixArk built a recipe that trains the model with GRPO in Miles, in BF16. You can update the full model or use LoRA to train adapters while keeping the base weights frozen. Megatron trains, SGLang generates the rollouts, and Miles publishes the new weights to the rollout engines after each update. We reviewed the recipe.\n\n| Workload | Reference configuration | \n|---|---|\n| Inference / eval, BF16 | 16x H200 per engine | \n| Full-parameter GRPO, BF16 (Miles) | 96x H200: 64 train, 32 rollout. Or 64x H200 colocated. | \n| LoRA GRPO, BF16 (Miles) | 32x H200: 16 train, 16 rollout. | \n| Full-parameter GRPO, BF16, 128-token context (Miles) | 48x H200: 32 train, 16 rollout. The setup Reflection and RadixArk first validated on the real checkpoint. | \n\nThe recipe runs GRPO on DAPO-Math-17K and evaluates on AIME25. Build the image, download the data, and submit the job to a Ray cluster of twelve 8x H200 nodes:\n\n```\ndocker build -f docker/Dockerfile.beam -t miles-beam .\npython scripts/run_beam.py prepare \\\n  --model-id reflection/Beam-1.0-501B-A23B \\\n  --model-dir /root/models/Beam \\\n  --data-dir /data/datasets\nexport MASTER_ADDR=10.0.0.1\nexport RAY_ADDRESS=http://${MASTER_ADDR}:8265\npython scripts/run_beam.py execute \\\n  --model-dir /root/models/Beam \\\n  --data-dir /data/datasets \\\n  --output-dir /root/shared_data/beam-run \\\n  --num-rollout 100\n```\nWhat happens in a rollout:\n\n**Sample:** 32 prompts are passed to the model with 8 responses each. Two SGLang engines serve the rollouts on 16 GPUs each.\n\n**Score:** the boxed answer is checked against the label, with a soft penalty for responses near the length limit.\n\n**Update:** one optimizer step on all 256 samples. Group-relative advantages with truncated importance sampling, no KL or entropy penalty.\n\n**Train in parallel:** tensor parallelism 8, expert parallelism 8, data parallelism 8, with sequence parallelism and full recompute.\n\n**Optimizer:** Adam at a constant 1e-6. Gradients in BF16, master weights in FP32, moments in BF16. The optimizer state streams through node-local NVMe, so each trainer node needs 2 TB of scratch.\n\n**Evaluate:** AIME25 every five rollouts, eight samples per problem. A checkpoint is saved every twenty.\n\nThe next rollout is generated while the current one trains, so responses are one update behind. Add `--resume` to continue from the last checkpoint. `execute-colocate` runs the same recipe on eight nodes, with every GPU training and serving in turn.\n\n### Train with LoRA\n\nYou can also run GRPO with LoRA on four 8× H200 nodes: 16 GPUs for training and 16 for rollouts. The recipe trains rank-16 adapters on Beam’s attention, dense MLP, and expert layers while keeping the base weights frozen. Only adapter weights are synchronized with SGLang, and the optimizer state stays in GPU memory, removing the need for NVMe optimizer offloading.\n\n```\npython scripts/run_beam_lora.py execute \\\n  --model-dir /root/models/Beam \\\n  --data-dir /data/datasets \\\n  --output-dir /root/shared_data/beam-run \\\n  --num-rollout 100\n```\n## Build with Beam: Demos\n\nIf you build something with Beam, then share it on the Hub for a chance to win $10,000. All you have to do is build a space, model, or dataset repo and share it on the model’s repo page. To inspire you, here are a few things we built.\n\n### Hey Beam, build a native local MacOS application!\n\nAt Hugging Face we love open and local models that run native to their hardware, but building native apps on Mac can be hard! Let’s see if Beam can help us out.\n\nWe asked Beam to build a native MacOS application that turns speech to text, and conveniently drops it at your cursor. We want to use MLX to get the most out of our Mac Metal and the Parakeet Model for great speech-to-text.\n\n```\nBuild BeamSpeak, a native macOS menu bar dictation app with a compact recording pill and no main window or account.\nUse ⌘⇧Space to start and stop microphone recording, showing elapsed time, microphone level, and transcription status. Run speech recognition entirely locally using a Hugging Face model, preferably Parakeet v3 through MLX, and keep the model loaded between recordings. Paste the transcript into the original app if it remains focused and Accessibility permission is granted; otherwise copy it to the clipboard, preserving newer clipboard changes and never pressing Enter. Handle permissions, cancellation, silence, errors, a two-minute recording limit, and temporary audio cleanup. Deliver source code, a runnable BeamSpeak.app, setup instructions, and verification of offline transcription, the physical shortcut, microphone capture, and text delivery.\n```\nWe used Beam with the Pi coding harness to build the initial native macOS menu bar app, running Parakeet with MLX. The saved run includes follow-up prompts; the final source also includes later Codex repairs. The prompt above is a condensed version of the build requirements.\n\nYou can check out the agent trace of how Beam built this in pi in this trace. If you want to try the demo out, download the source code or read the setup instructions.\n\n### Hey Beam, how do you scale on multiple agents?\n\nWe wanted to see whether Beam could make faster progress by splitting a programming task across agents. We paired Beam with the open-source Pi coding agent and compared three setups: 1. one agent working alone, 2. five persistent peers collaborating through a shared Git repository, and 3. a lead agent delegating work to asynchronous subagents. The harness ran on Hugging Face jobs with inference through Reflection’s platform API.\n\nFor the tasks, we used ProgramBench: agents must recreate a program from its compiled executable and documentation, without seeing its source code or the evaluator’s tests. Each setup had the same 8M API-token ceiling and two-hour solver limit per task, shared across its agents. We saved implementation snapshots and evaluated them against fixed hidden-test suites from the ProgramBench-Tests dataset.\n\nOur score-versus-latency plot shows the average fraction of tests passed. The time axis uses fixed reference rates for model tokens plus measured tool time, rather than elapsed wall time. We initially ran five tasks. The current figure shows a post-hoc subset of jq, xsv, FIGlet, and hexyl; ripgrep was excluded across all three setups because grading its saved artifacts was too slow. The published results retain all 15 original episodes.\n\nYou can inspect the runs in the Trackio dashboard, explore the published result data, and reuse the study harness.\n\n### Hey Beam, finetune a decision model for my code base!\n\nDecision models are all the rage at the moment because they’re super fast and practical for many use cases. We started with Beam, then continued with GLM-5.3 in Pi after Beam’s quota ran out to train and evaluate a custom decision model for developer incident triage.\n\nWe wanted to see whether a coding agent could turn an incident-triage policy into a small, fast decision model. The task was to read a developer incident and choose the responsible team, its severity, and whether someone should be pinged immediately. Using Unsloth, we fine-tuned Qwen3.5-0.8B to score these choices directly.\n\nFirst, the workflow built a synthetic dataset containing 2.3k incidents split by incident cluster for training, calibration, and testing. We trained a LoRA adapter and decision head for three epochs, with a 4-bit backbone, on one H100 80GB on the Science Slurm cluster.\n\nFor a baseline, we prompted the unadapted model with the full triage policy and ticket, without examples, and asked it to generate the three decisions as JSON. On the same 320 synthetic test tickets, the fine-tuned decision model got all three answers correct on 76.25%, versus 4.69% for prompted zero-shot. Mean ticket latency fell from 1,218.06 ms to 102.58 ms, an 11.9× speedup.\n\nIf you want to try out this experiment for yourself, check out the artifact bucket which contains the data, code, checkpoints and results.\n\n## Wrapping Up\n\nBeam is a 501B open model that you can run on your own hardware and change. Start with the **BF16** checkpoint, or try one of the quants **FP8****,** **NVFP4**. If you build something with Beam, share it in the discussions tab.","body_html":"<h1 id=\"welcome-beam-a-501b-open-model-you-can-own-customize-and-scale\">Welcome Beam: a 501B open model you can own, customize, and scale</h1>\n<p><strong>context window of 1M tokens</strong>, and is released under the Apache 2.0 license.</p>\n<p>Beam is focused on <em>coding</em> and <em>agentic</em> use cases. It is for teams that want a frontier-scale model on their own hardware, infrastructure, or cloud, and want to customize it to their own use cases. Beam ships with its own dedicated open source Rust based harness that delivers the best performance from the model.</p>\n<p>Beam has a native transformers implementation, as well as downstream libraries like vLLM and SGLang. We’ve worked with the Reflection team to bring you inference, SFT (supervised fine tuning), and RL (reinforcement learning) recipes for you to build with this model for your needs. On top of day-0 support in transformers, SGLang and vLLM, this post shows you how to run it, how to post-train it, and what we built with it.</p>\n<p><strong>TL;DR</strong></p>\n<ul><li>501B-parameter MoEs LLM with 23B active per token. 52 layers, 256 experts per MoE layer, 8 routed per token.</li><li><p>Text in, text out with</p><p><strong>context window of 1M tokens.</strong>- Checkpoint formats:\n<strong>BF16</strong><strong>, FP8,</strong> and <strong>NVFP4</strong>- Reasoning that can stay in context across turns (\n<code>preserve_thinking</code>), tool calling with a dedicated grammar. The model supports five reasoning values: &quot;low&quot;, &quot;medium&quot; (default), &quot;high&quot;, &quot;xhigh&quot;, and &quot;max&quot;.- Response template in the tokenizer.</p></li><li>Speculative decoding drafter model with DFlash2</li><li>Day-0 libraries: transformers, SGLang, vLLM. Full-parameter RL with Miles.</li><li>Ships with a Rust-based custom harness.</li><li>Apache 2.0.</li></ul>\n<h2 id=\"build-with-beam\">Build with Beam</h2>\n<p>Reflection is going to give out $10,000 Hub credits to the best projects that use Beam. All you have to do is make a thing, and share it on the Hub:</p>\n<ul><li>You could make a demo that uses the Beam model on Spaces</li><li>You could quantize it for your favorite hardware</li><li>You could generate a synthetic dataset for your favorite problem</li><li>You could build an RL environment with or for Beam</li><li>You could benchmark Beam and share the results.</li><li>You could surprise us!</li></ul>\n<p>If you build something with Beam, then share it on the Hub for a chance to win $10,000. All you have to do is build the space, model, or dataset repo and share it on the model’s repo page. We’ll collect all the links, select the best, and send out the credits to your Hub accounts.</p>\n<h2 id=\"what-is-beam\">What is Beam?</h2>\n<p>Beam is a text-only model built for long-context (1M context length) reasoning and agentic work. It is a sparse MoE model, where each token is computed by a small fraction of the network, so it runs at the speed of a much smaller model while keeping the capacity of a large one.</p>\n<h3 id=\"attention\">Attention</h3>\n<p>The decoder has 52 layers with a hidden size of 5,120. Most layers use sliding-window attention over the previous 512 tokens; every sixth layer, and the last one, attend to the full context. That gives 43 sliding-window layers and 9 global ones.</p>\n<p><em>Inside the attention block (both layer types)</em></p>\n<p>The two kinds of layers handle position differently. Sliding-window layers use RoPE, since relative position matters most within a short window. <strong>Global layers use no positional encoding</strong>. Instead, each query is multiplied by a scaler that grows slowly with the number of visible tokens, <code>(1 + (pos + 1) / 2048) ** 0.1</code>. It acts as a temperature: the softmax keeps its precision as the context lengthens instead of flattening out. The implementation calls this scalable-softmax query scaling.</p>\n<p>Attention uses grouped-query attention with 48 query heads and 8 key-value heads, with RMSNorm on queries and keys. A learned sigmoid gate, computed from the layer input, scales every channel of every head before the output projection.</p>\n<h3 id=\"mixture-of-experts\">Mixture of Experts</h3>\n<p>The first 3 layers use a dense SwiGLU MLP. The other 49 replace it with a Mixture-of-Experts block of 256 experts, each a SwiGLU MLP with an intermediate size of 2,560, or about 39M parameters. The experts hold 98.4% of the model&#39;s parameters.</p>\n<p>The router follows DeepSeek-V3&#39;s group-limited scheme. It scores all 256 experts with a sigmoid, splits them into 8 groups of 32, keeps the 4 best groups (ranked by the sum of each group&#39;s top two scores), then picks the top 8 experts inside them. Beam uses the same group sizes as DeepSeek-V3 but no shared expert. Expert outputs are combined with normalized router weights and scaled by 2.5.</p>\n<p>Only 8 experts run per token, so the model computes each token with about 23B parameters. All 256 experts stay in memory, so deployment needs the memory of a 501B model but runs at the speed of a 23B one. The BF16 checkpoint is about 1 TB in safetensors format. The NVFP4 checkpoint stores most parameters in 4-bit precision for NVIDIA Blackwell GPUs, some parameters are kept in BF16 for accuracy. There are also FP8 checkpoints on the hub which are ideal for Hopper and Ampere series chips.</p>\n<p>If you want to deploy Beam yourself, check out the vLLM or SGLang recipes below.</p>\n<h3 id=\"residual-stream\">Residual Stream</h3>\n<p>The residual connections are the most distinctive part. A standard transformer adds each sublayer output to the stream with weight 1, so the stream grows with depth.</p>\n<p>Beam counts the input embedding as step 1. At step <code>k</code> it adds the sublayer output with weight <code>1/sqrt(k)</code> and keeps the existing stream with weight <code>sqrt((k-1)/k)</code>. The squares of the two weights sum to one, so the stream stays at a constant scale from the first layer to the last. After all 104 additions, every sublayer output and the input embedding carry the same weight in the final hidden state.</p>\n<p>Every sublayer is also normalized before and after, and the final logits pass through a tanh softcap at ±30, computed in FP32. The implementation fixes where it computes in FP32: the router, the SwiGLU product, the norms, RoPE, the query scaling and the softcap.</p>\n<h3 id=\"long-context\">Long Context</h3>\n<p>Hybrid attention works well for long contexts. Each layer caches 2 x 8 KV heads x 128 dims = 2,048 values per token. If all 52 layers kept every token, the cache would grow by 208 KiB per token. Only the 9 global layers keep the whole sequence. The 43 sliding-window layers hold a fixed 512-token window each and stop growing. So the cache grows by 36 KiB per token, roughly a sixth of the naive rate.</p>\n<div class=\"table-wrap\"><table><thead><tr><th>Context</th><th>If all 52 layers were global</th><th>Beam</th></tr></thead><tbody><tr><td>32K tokens</td><td>6.5 GiB</td><td>1.2 GiB</td></tr><tr><td>128K tokens</td><td>26 GiB</td><td>4.6 GiB</td></tr><tr><td>Full context (1M)</td><td>208 GiB</td><td><strong>36.08 GiB</strong></td></tr></tbody></table></div>\n<p>These numbers are per sequence, in BF16, with the transformers dynamic cache.</p>\n<h2 id=\"benchmark-results\">Benchmark Results</h2>\n<p>Here are the benchmark results across different precision levels, as provided by the Reflection team.</p>\n<div class=\"table-wrap\"><table><thead><tr><th></th><th><em>Beam (BF16)</em></th><th><em>Beam (FP8)</em></th><th><em>Beam (NVFP4)</em></th></tr></thead><tbody><tr><td><strong>Agentic Coding / Terminal</strong></td><td></td><td></td><td></td></tr><tr><td>DeepSWE v1.1</td><td>43.3%</td><td>43.0%</td><td>42.7%</td></tr><tr><td>SWE Bench Pro v2-Hard</td><td>76.5%</td><td>78.4%</td><td>78.6%</td></tr><tr><td>SWE Bench Pro v1</td><td>66.1%</td><td>65.9%</td><td>65.6%</td></tr><tr><td>Terminal Bench v2.1</td><td>80.1%</td><td>78.9%</td><td>78.2%</td></tr><tr><td>SWE Atlas Codebase QnA</td><td>31.8%</td><td>32.2%</td><td>31.4%</td></tr><tr><td>SWEBench Multilingual</td><td>78.3%</td><td>78.1%</td><td>77.5%</td></tr><tr><td>SWEBench Verified</td><td>81.6%</td><td>80.2%</td><td>80.7%</td></tr><tr><td><strong>Reasoning</strong></td><td></td><td></td><td></td></tr><tr><td>AIME 2026</td><td>97.7%</td><td>98.0%</td><td>97.5%</td></tr><tr><td>HLE (no tools)</td><td>36.0%</td><td>36.0%</td><td>34.8%</td></tr><tr><td>HLE (with tools)</td><td>51.1%</td><td>51.1%</td><td>51.1%</td></tr><tr><td>SciCode</td><td>49.2%</td><td>48.3%</td><td>46.9%</td></tr><tr><td>CriPT AA</td><td>16.3%</td><td>17.4%</td><td>15.4%</td></tr><tr><td>GPQA Diamond</td><td>90.6%</td><td>90.3%</td><td>89.3%</td></tr><tr><td>LiveCodeBench</td><td>88.3%</td><td>88.1%</td><td>87.4%</td></tr><tr><td><strong>Tool Calling / Search</strong></td><td></td><td></td><td></td></tr><tr><td>AutomationBench - public split only</td><td>39.3</td><td>38.2</td><td>39.8%</td></tr><tr><td>MCP Atlas</td><td>80.8%</td><td>81.5%</td><td>80.5%</td></tr><tr><td>Tau3 Banking</td><td>36.1%</td><td>36.8%</td><td>35.4%</td></tr><tr><td>BrowseComp w/ context management</td><td>76.8%</td><td>76.7%</td><td>75.6%</td></tr><tr><td>DeepSearchQA w/ context management</td><td>80.5%</td><td>79.6%</td><td>81.1%</td></tr><tr><td><strong>General Capabilities</strong></td><td></td><td></td><td></td></tr><tr><td>AA-LCR</td><td>78.2%</td><td>79.4%</td><td>78.7%</td></tr><tr><td>LongBench v2</td><td>67.5%</td><td>67.6%</td><td>67.2%</td></tr><tr><td>IFBench</td><td>79.6%</td><td>80.7%</td><td>79.2%</td></tr><tr><td>AA Omniscience (index) - public split only</td><td>10.8</td><td>8.8</td><td>9.8</td></tr></tbody></table></div>\n<h2 id=\"hardware-requirements\">Hardware Requirements</h2>\n<p>The most practical way to serve the model is serving the NVFP4 checkpoint, which retains most of the quality of the bf16 checkpoint. NVFP4 stores some weights in 4 bits, and this way, it shrinks the 501B parameters in BF16 from 1 TB to ~280 GB. Blackwell GPUs run NVFP4 natively but GPUs older than Blackwell like the H200 can&#39;t. The FP8 checkpoints are suitable for GPUs older than Blackwell.</p>\n<p>A B200 has 180 GB of HBM3e, so two of them (360 GB) can hold the Beam weights, with little room left for activations and the KV cache. Plan for four B200s (720 GB), which leaves plenty of room for long contexts and concurrent requests. You can also serve it on a full 8xB200 node, or on two B300s at 288 GB each, or even 8xRTX Pro 6000. If you don&#39;t have Blackwell hardware, use Inference Providers (serverless) to test Reflection.</p>\n<h2 id=\"inference-support\">Inference Support</h2>\n<p>Beam comes with day-0 support in transformers, SGLang and vLLM.</p>\n<h3 id=\"transformers\">Transformers</h3>\n<p>Install the latest version of transformers.</p>\n<pre><code>pip install -U &quot;transformers&gt;=5.20.1&quot;</code></pre>\n<p>The easiest way to run Beam is the text-generation pipeline:</p>\n<pre><code>from transformers import pipeline\npipe = pipeline(\n    &quot;text-generation&quot;, model=&quot;reflection/Beam-1.0-501B-A23B&quot;, device_map=&quot;auto&quot;\n)\nmessages = [\n    {&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;Write a limerick about Python exceptions.&quot;}\n]\noutput = pipe(messages, max_new_tokens=2000)\noutput[0][&quot;generated_text&quot;][-1]</code></pre>\n<p>The pipeline returns the whole chat. The last message is Beam&#39;s reply, already parsed by the response template.</p>\n<p>Going one level lower, use <code>AutoModelForCausalLM</code> and <code>AutoTokenizer</code>.</p>\n<pre><code>from transformers import AutoModelForCausalLM, AutoTokenizer\nmodel_id = &quot;reflection/Beam-1.0-501B-A23B&quot;\ntokenizer = AutoTokenizer.from_pretrained(model_id)\nmodel = AutoModelForCausalLM.from_pretrained(\n    model_id, dtype=&quot;auto&quot;, device_map=&quot;auto&quot;\n)</code></pre>\n<h4 id=\"chat\">Chat</h4>\n<pre><code>messages = [\n    {&quot;role&quot;: &quot;system&quot;, &quot;content&quot;: &quot;You should only answer with a number.&quot;},\n    {&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;What is 17 * 23?&quot;},\n]\ninputs = tokenizer.apply_chat_template(\n    messages,\n    add_generation_prompt=True,\n    tokenize=True,\n    return_dict=True,\n    return_tensors=&quot;pt&quot;,\n    reasoning_effort=&quot;medium&quot; # by default\n).to(model.device)\ninput_len = inputs[&quot;input_ids&quot;].shape[-1]\noutputs = model.generate(**inputs, max_new_tokens=2000)\ntokenizer.parse_response(\n    outputs[0][input_len:], prefix=inputs[&quot;input_ids&quot;][0]\n)</code></pre>\n<p>Beam&#39;s tokenizer carries a response template. <code>parse_response</code> reads it and turns the raw output into a message dict, with the reasoning, the answer, and any tool calls in separate fields. This avoids the usual regex for splitting reasoning from answers from tool calls. And the rules ship with the tokenizer, so the parsed structure matches what Beam was trained to produce. The chat template can pre-write part of the assistant turn, which the parser needs to see.</p>\n<h4 id=\"tool-calling\">Tool calling</h4>\n<h2 id=\"complete-tool-calling-example\">Complete tool-calling example</h2>\n<pre><code>def get_weather(city: str, unit: str = &quot;celsius&quot;):\n    &quot;&quot;&quot;\n    Get the current weather for a city.\n    Args:\n        city: The city to look up.\n        unit: Temperature unit, &quot;celsius&quot; or &quot;fahrenheit&quot;.\n    &quot;&quot;&quot;\n    ...\ntools = [get_weather]\nmessages = [\n    {&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;I land in Paris tonight. Do I need a coat?&quot;}\n]\ninputs = tokenizer.apply_chat_template(\n    messages,\n    tools=tools,\n    add_generation_prompt=True,\n    tokenize=True,\n    return_dict=True,\n    return_tensors=&quot;pt&quot;,\n).to(model.device)\ninput_len = inputs[&quot;input_ids&quot;].shape[-1]\noutputs = model.generate(**inputs, max_new_tokens=1000)\nmessage = tokenizer.parse_response(\n    outputs[0][input_len:], prefix=inputs[&quot;input_ids&quot;][0], tools=tools\n)\nmessage.get(&quot;tool_calls&quot;)</code></pre>\n<p>Pass <code>tools</code> to <code>parse_response</code> as well. Beam writes tool-call arguments inline, in its own XML-style grammar, so a bare <code>7</code> could be a number or a string. With the tool schemas, the parser casts each argument to its declared type.</p>\n<h4 id=\"multi-gpu-and-multi-node\">Multi-GPU and multi-node</h4>\n<p>Beam&#39;s config defines an expert-parallel plan. Expert parallelism puts each expert on one device. Attention, the dense layers, the embeddings and the LM head are replicated on every device. That is 8B parameters, or 16 GB in BF16. Load the model with a <code>DistributedConfig</code>:</p>\n<pre><code>import os\nfrom transformers import AutoModelForCausalLM\nfrom transformers.distributed import DistributedConfig\nmodel = AutoModelForCausalLM.from_pretrained(\n    &quot;reflection/Beam-1.0-501B-A23B&quot;,\n    distributed_config=DistributedConfig(\n        tp_size=int(os.environ[&quot;WORLD_SIZE&quot;]), ep_size=int(os.environ[&quot;WORLD_SIZE&quot;]), tp_plan={}\n    ),\n)</code></pre>\n<p>Launch the script with <code>torchrun</code> across 16 H200 GPUs. Each one then holds 78 GB of weights. With 8 GPUs each would hold 139 GB, which leaves no room on a 141 GB H200. The number of devices must divide the number of experts, 256.</p>\n<h3 id=\"vllm\">vLLM</h3>\n<p>Beam has day-0 support in vLLM. The command below serves the BF16 checkpoint with tensor parallelism across 16 GPUs (two 8x H200 nodes) and exposes an OpenAI-compatible API:</p>\n<pre><code>vllm serve reflection/Beam-1.0-501B-A23B --tensor-parallel-size 16 --served-model-name beam</code></pre>\n<p>For faster generation, add DFlash2 speculative decoding. A small drafter model proposes up to 15 tokens ahead, and Beam checks them all in one forward pass, so each step can accept several tokens. The cost is a little extra memory for the drafter:</p>\n<pre><code>vllm serve reflection/Beam-1.0-501B-A23B \\\n  --tensor-parallel-size 16 \\\n  --speculative-config &#39;{ &quot;method&quot;: &quot;dflash&quot;, &quot;model&quot;: &quot;reflection/dflash2-drafter-preview&quot;, &quot;num_speculative_tokens&quot;: 15 }&#39;</code></pre>\n<p>Both commands start an OpenAI-compatible server, so you can point any OpenAI client at <code>http://localhost:8000/v1</code>. For additional serving configurations, see the proposed Beam recipe for vLLM.</p>\n<h3 id=\"sglang\">SGLang</h3>\n<p>Beam also has day-0 support in SGLang. We recommend serving it with DFlash2 speculative decoding, which both commands below turn on. On Blackwell, the NVFP4 checkpoint fits on 4 B300s:</p>\n<pre><code>python -m sglang.launch_server \\\n--model-path reflection/Beam-1.0-501B-A23B-NVFP4 \\\n--served-model-name beam \\\n--tp 4 \\\n--attention-backend trtllm_mha \\\n--page-size 64 \\\n--context-length 1048576 \\\n--mem-fraction-static 0.85 \\\n--enable-unified-memory \\\n--speculative-algorithm DFLASH \\\n--speculative-draft-model-path reflection/Beam-1.0-501B-A23B-DFlash2 \\\n--speculative-dflash-block-size 8 \\\n--tool-call-parser beam --reasoning-parser beam \\\n--host 0.0.0.0 --port 30000</code></pre>\n<p>On Hopper GPUs, use the FP8 checkpoint on 8 H200s instead. Only three flags change: the checkpoint, the tensor-parallel size (8 instead of 4), and the attention backend (fa3 instead of trtllm_mha, which needs Blackwell):</p>\n<pre><code>python -m sglang.launch_server \\\n--model-path reflection/Beam-1.0-501B-A23B-FP8 \\\n--served-model-name beam \\\n--tp 8 \\\n--attention-backend fa3 \\\n--page-size 64 \\\n--context-length 1048576 \\\n--mem-fraction-static 0.85 \\\n--enable-unified-memory \\\n--speculative-algorithm DFLASH \\\n--speculative-draft-model-path reflection/Beam-1.0-501B-A23B-DFlash2 \\\n--speculative-dflash-block-size 8 \\\n--tool-call-parser beam --reasoning-parser beam \\\n--host 0.0.0.0 --port 30000</code></pre>\n<h3 id=\"inference-providers\">Inference Providers</h3>\n<p>Beam is available on Hugging Face Inference Providers, powered by Baseten, Fireworks, and Together, with more to follow soon.</p>\n<pre><code>import os\nfrom openai import OpenAI\nclient = OpenAI(\n    base_url=&quot;https://router.huggingface.co/v1&quot;,\n    api_key=os.environ[&quot;HF_TOKEN&quot;],\n)\ncompletion = client.chat.completions.create(\n    model=&quot;reflection/Beam-1.0-501B-A23B:auto&quot;,\n    messages=[{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;What is the capital of France?&quot;}],\n)\nprint(completion.choices[0].message)</code></pre>\n<h3 id=\"inference-endpoints\">Inference Endpoints</h3>\n<p>We’ve set up a Beam recipe for you to one click deploy in Inference Endpoints from the catalog in FP8 or NVFP4, or install with the <code>hf</code> cli like so:</p>\n<pre><code>hf endpoints catalog deploy --repo reflection/Beam-1.0-501B-A23B --name beam</code></pre>\n<h2 id=\"what-we-tested\">What we tested</h2>\n<p>We are sharing some vibe evals of Reflection Beam-501B-A23B on five tasks, once each at low and high reasoning effort through the Reflection platform. These are vibe evals, not benchmarks. If you’re planning on using Beam, this is a great way to kick the tires and see how it behaves on specific use cases, and importantly, where it wins and loses.</p>\n<p>Below is an overview of the prompts we ran and the output traces from the hub. The complete inputs, outputs, API usage, task fixtures, graders and conversation traces are in this public Hugging Face bucket.</p>\n<div class=\"table-wrap\"><table><thead><tr><th>Category</th><th>Prompt Description</th><th>Low reasoning (tokens)</th><th>High reasoning (tokens)</th></tr></thead><tbody><tr><td>Multi-step tool calling</td><td>Fulfill ORD-742: compare stock, reservations, surcharges and arrival dates; reserve the cheapest eligible warehouse.</td><td>✅ 544</td><td>✅ 811</td></tr><tr><td>Long-context retrieval over a code base</td><td>Derive Click command configuration and two invocation results from three complete source files; cite six implementation symbols.</td><td>🔴 1,613 *</td><td>✅ 5,007</td></tr><tr><td>Terminal task in a sandbox</td><td>Inspect and repair a CSV ledger CLI; fix all bugs, preserve tests, run tests and a CLI check.</td><td>✅ 582</td><td>✅ 1,548</td></tr><tr><td>Math reasoning (AIME-style)</td><td>How many eight-element subsets of {1, …, 16} have a sum divisible by 17? Give a justification.</td><td>🟠 829 †</td><td>✅ 2,809</td></tr><tr><td>Structured output</td><td>Convert an out-of-order revision log into strict JSON: merge patches, cancellations, nulls, dates, currencies and totals.</td><td>✅ 1,040</td><td>✅ 2,088</td></tr></tbody></table></div>\n<p>** Low&#39;s long-context response got all code behavior and all six source citations correct. However, the response did not correspond to the parsers format, so this is partly prompt ambiguity.*</p>\n<p>† Low returned the correct answer, but omitted the requested justification. High supplied a correct roots-of-unity proof, independently reviewed.</p>\n<p>Don’t take our word for it. Dig into the bucket, rewrite for your use case or project and push Beam to the limit.</p>\n<h2 id=\"post-training-beam\">Post-training Beam</h2>\n<p>You can fine tune Beam for your own use cases. Here, we share some examples in TRL and Miles to get you started on supervised fine-tuning and reinforcement learning.</p>\n<h3 id=\"sft-with-trl\">SFT with TRL</h3>\n<p>The quickest way to adapt Beam to your own data is supervised fine-tuning with TRL&#39;s SFTTrainer. To keep memory manageable, we train LoRA adapters with PEFT rather than updating all 501B parameters:\nWe used TRL’s <code>SFTTrainer</code> to adapt Beam to a simple goal: keep its reasoning in the language requested by the user. We fine-tuned on Multilingual-Thinking with LoRA, which trains a small set of adapter weights while keeping the base model frozen.</p>\n<p>The setup combines model sharding at load time, expert parallelism, FlashAttention 4 and sequence packing. LoRA SFT fits on a single node with 8 B300 GPUs, reaching around 19,000 tokens per second. The corresponding H100 setup uses four nodes.</p>\n<p>After one epoch of Multilingual-Thinking, Beam reasoned in the requested language on 16 out of 16 held-out prompts, compared with 3 out of 16 for the base model. This small evaluation measures language adherence, rather than the correctness of the reasoning itself.</p>\n<p><em>Training loss (left) and mean token accuracy (right) during a separate 500-step run on a reasoning subset of open-r1/Mixture-of-Thought, using one 8-GPU B300 node. These training metrics are from the official TRL example PR.</em></p>\n<h3 id=\"grpo-with-miles\">GRPO with Miles</h3>\n<p>Reflection and RadixArk built a recipe that trains the model with GRPO in Miles, in BF16. You can update the full model or use LoRA to train adapters while keeping the base weights frozen. Megatron trains, SGLang generates the rollouts, and Miles publishes the new weights to the rollout engines after each update. We reviewed the recipe.</p>\n<div class=\"table-wrap\"><table><thead><tr><th>Workload</th><th>Reference configuration</th></tr></thead><tbody><tr><td>Inference / eval, BF16</td><td>16x H200 per engine</td></tr><tr><td>Full-parameter GRPO, BF16 (Miles)</td><td>96x H200: 64 train, 32 rollout. Or 64x H200 colocated.</td></tr><tr><td>LoRA GRPO, BF16 (Miles)</td><td>32x H200: 16 train, 16 rollout.</td></tr><tr><td>Full-parameter GRPO, BF16, 128-token context (Miles)</td><td>48x H200: 32 train, 16 rollout. The setup Reflection and RadixArk first validated on the real checkpoint.</td></tr></tbody></table></div>\n<p>The recipe runs GRPO on DAPO-Math-17K and evaluates on AIME25. Build the image, download the data, and submit the job to a Ray cluster of twelve 8x H200 nodes:</p>\n<pre><code>docker build -f docker/Dockerfile.beam -t miles-beam .\npython scripts/run_beam.py prepare \\\n  --model-id reflection/Beam-1.0-501B-A23B \\\n  --model-dir /root/models/Beam \\\n  --data-dir /data/datasets\nexport MASTER_ADDR=10.0.0.1\nexport RAY_ADDRESS=http://${MASTER_ADDR}:8265\npython scripts/run_beam.py execute \\\n  --model-dir /root/models/Beam \\\n  --data-dir /data/datasets \\\n  --output-dir /root/shared_data/beam-run \\\n  --num-rollout 100</code></pre>\n<p>What happens in a rollout:</p>\n<p><strong>Sample:</strong> 32 prompts are passed to the model with 8 responses each. Two SGLang engines serve the rollouts on 16 GPUs each.</p>\n<p><strong>Score:</strong> the boxed answer is checked against the label, with a soft penalty for responses near the length limit.</p>\n<p><strong>Update:</strong> one optimizer step on all 256 samples. Group-relative advantages with truncated importance sampling, no KL or entropy penalty.</p>\n<p><strong>Train in parallel:</strong> tensor parallelism 8, expert parallelism 8, data parallelism 8, with sequence parallelism and full recompute.</p>\n<p><strong>Optimizer:</strong> Adam at a constant 1e-6. Gradients in BF16, master weights in FP32, moments in BF16. The optimizer state streams through node-local NVMe, so each trainer node needs 2 TB of scratch.</p>\n<p><strong>Evaluate:</strong> AIME25 every five rollouts, eight samples per problem. A checkpoint is saved every twenty.</p>\n<p>The next rollout is generated while the current one trains, so responses are one update behind. Add <code>--resume</code> to continue from the last checkpoint. <code>execute-colocate</code> runs the same recipe on eight nodes, with every GPU training and serving in turn.</p>\n<h3 id=\"train-with-lora\">Train with LoRA</h3>\n<p>You can also run GRPO with LoRA on four 8× H200 nodes: 16 GPUs for training and 16 for rollouts. The recipe trains rank-16 adapters on Beam’s attention, dense MLP, and expert layers while keeping the base weights frozen. Only adapter weights are synchronized with SGLang, and the optimizer state stays in GPU memory, removing the need for NVMe optimizer offloading.</p>\n<pre><code>python scripts/run_beam_lora.py execute \\\n  --model-dir /root/models/Beam \\\n  --data-dir /data/datasets \\\n  --output-dir /root/shared_data/beam-run \\\n  --num-rollout 100</code></pre>\n<h2 id=\"build-with-beam-demos\">Build with Beam: Demos</h2>\n<p>If you build something with Beam, then share it on the Hub for a chance to win $10,000. All you have to do is build a space, model, or dataset repo and share it on the model’s repo page. To inspire you, here are a few things we built.</p>\n<h3 id=\"hey-beam-build-a-native-local-macos-application\">Hey Beam, build a native local MacOS application!</h3>\n<p>At Hugging Face we love open and local models that run native to their hardware, but building native apps on Mac can be hard! Let’s see if Beam can help us out.</p>\n<p>We asked Beam to build a native MacOS application that turns speech to text, and conveniently drops it at your cursor. We want to use MLX to get the most out of our Mac Metal and the Parakeet Model for great speech-to-text.</p>\n<pre><code>Build BeamSpeak, a native macOS menu bar dictation app with a compact recording pill and no main window or account.\nUse ⌘⇧Space to start and stop microphone recording, showing elapsed time, microphone level, and transcription status. Run speech recognition entirely locally using a Hugging Face model, preferably Parakeet v3 through MLX, and keep the model loaded between recordings. Paste the transcript into the original app if it remains focused and Accessibility permission is granted; otherwise copy it to the clipboard, preserving newer clipboard changes and never pressing Enter. Handle permissions, cancellation, silence, errors, a two-minute recording limit, and temporary audio cleanup. Deliver source code, a runnable BeamSpeak.app, setup instructions, and verification of offline transcription, the physical shortcut, microphone capture, and text delivery.</code></pre>\n<p>We used Beam with the Pi coding harness to build the initial native macOS menu bar app, running Parakeet with MLX. The saved run includes follow-up prompts; the final source also includes later Codex repairs. The prompt above is a condensed version of the build requirements.</p>\n<p>You can check out the agent trace of how Beam built this in pi in this trace. If you want to try the demo out, download the source code or read the setup instructions.</p>\n<h3 id=\"hey-beam-how-do-you-scale-on-multiple-agents\">Hey Beam, how do you scale on multiple agents?</h3>\n<p>We wanted to see whether Beam could make faster progress by splitting a programming task across agents. We paired Beam with the open-source Pi coding agent and compared three setups: 1. one agent working alone, 2. five persistent peers collaborating through a shared Git repository, and 3. a lead agent delegating work to asynchronous subagents. The harness ran on Hugging Face jobs with inference through Reflection’s platform API.</p>\n<p>For the tasks, we used ProgramBench: agents must recreate a program from its compiled executable and documentation, without seeing its source code or the evaluator’s tests. Each setup had the same 8M API-token ceiling and two-hour solver limit per task, shared across its agents. We saved implementation snapshots and evaluated them against fixed hidden-test suites from the ProgramBench-Tests dataset.</p>\n<p>Our score-versus-latency plot shows the average fraction of tests passed. The time axis uses fixed reference rates for model tokens plus measured tool time, rather than elapsed wall time. We initially ran five tasks. The current figure shows a post-hoc subset of jq, xsv, FIGlet, and hexyl; ripgrep was excluded across all three setups because grading its saved artifacts was too slow. The published results retain all 15 original episodes.</p>\n<p>You can inspect the runs in the Trackio dashboard, explore the published result data, and reuse the study harness.</p>\n<h3 id=\"hey-beam-finetune-a-decision-model-for-my-code-base\">Hey Beam, finetune a decision model for my code base!</h3>\n<p>Decision models are all the rage at the moment because they’re super fast and practical for many use cases. We started with Beam, then continued with GLM-5.3 in Pi after Beam’s quota ran out to train and evaluate a custom decision model for developer incident triage.</p>\n<p>We wanted to see whether a coding agent could turn an incident-triage policy into a small, fast decision model. The task was to read a developer incident and choose the responsible team, its severity, and whether someone should be pinged immediately. Using Unsloth, we fine-tuned Qwen3.5-0.8B to score these choices directly.</p>\n<p>First, the workflow built a synthetic dataset containing 2.3k incidents split by incident cluster for training, calibration, and testing. We trained a LoRA adapter and decision head for three epochs, with a 4-bit backbone, on one H100 80GB on the Science Slurm cluster.</p>\n<p>For a baseline, we prompted the unadapted model with the full triage policy and ticket, without examples, and asked it to generate the three decisions as JSON. On the same 320 synthetic test tickets, the fine-tuned decision model got all three answers correct on 76.25%, versus 4.69% for prompted zero-shot. Mean ticket latency fell from 1,218.06 ms to 102.58 ms, an 11.9× speedup.</p>\n<p>If you want to try out this experiment for yourself, check out the artifact bucket which contains the data, code, checkpoints and results.</p>\n<h2 id=\"wrapping-up\">Wrapping Up</h2>\n<p>Beam is a 501B open model that you can run on your own hardware and change. Start with the <strong>BF16</strong> checkpoint, or try one of the quants <strong>FP8</strong><strong>,** **NVFP4</strong>. If you build something with Beam, share it in the discussions tab.</p>","headings":[{"level":1,"text":"Welcome Beam: a 501B open model you can own, customize, and scale","id":"welcome-beam-a-501b-open-model-you-can-own-customize-and-scale"},{"level":2,"text":"Build with Beam","id":"build-with-beam"},{"level":2,"text":"What is Beam?","id":"what-is-beam"},{"level":3,"text":"Attention","id":"attention"},{"level":3,"text":"Mixture of Experts","id":"mixture-of-experts"},{"level":3,"text":"Residual Stream","id":"residual-stream"},{"level":3,"text":"Long Context","id":"long-context"},{"level":2,"text":"Benchmark Results","id":"benchmark-results"},{"level":2,"text":"Hardware Requirements","id":"hardware-requirements"},{"level":2,"text":"Inference Support","id":"inference-support"},{"level":3,"text":"Transformers","id":"transformers"},{"level":2,"text":"Complete tool-calling example","id":"complete-tool-calling-example"},{"level":3,"text":"vLLM","id":"vllm"},{"level":3,"text":"SGLang","id":"sglang"},{"level":3,"text":"Inference Providers","id":"inference-providers"},{"level":3,"text":"Inference Endpoints","id":"inference-endpoints"},{"level":2,"text":"What we tested","id":"what-we-tested"},{"level":2,"text":"Post-training Beam","id":"post-training-beam"},{"level":3,"text":"SFT with TRL","id":"sft-with-trl"},{"level":3,"text":"GRPO with Miles","id":"grpo-with-miles"},{"level":3,"text":"Train with LoRA","id":"train-with-lora"},{"level":2,"text":"Build with Beam: Demos","id":"build-with-beam-demos"},{"level":3,"text":"Hey Beam, build a native local MacOS application!","id":"hey-beam-build-a-native-local-macos-application"},{"level":3,"text":"Hey Beam, how do you scale on multiple agents?","id":"hey-beam-how-do-you-scale-on-multiple-agents"},{"level":3,"text":"Hey Beam, finetune a decision model for my code base!","id":"hey-beam-finetune-a-decision-model-for-my-code-base"},{"level":2,"text":"Wrapping Up","id":"wrapping-up"}]}}