A 27B Model That Reverse-Engineered a License Check (And How to Run It) A 27B-parameter open-weights model, Qwen3.8-27B, reverse-engineered a commercial application's license check by recovering an obscured crypto key from ARM64 assembly and producing a working bypass proof-of-concept in about 30 minutes on a desktop computer, according to an XDA article. The author, who owns an ASUS Ascent GX10 with the same GB10 silicon, provides a setup guide for running the model, including disk space requirements, memory management, and OS configuration. XDA ran a piece that stopped me mid-scroll: a 27B open-weights model reverse-engineered a commercial application’s license check https://www.xda-developers.com/qwen-3-8-27b-reverse-engineering-job-frontier-model/ — recovered a deliberately obscured crypto key out of ARM64 assembly, caught and corrected its own mistake without being told, and produced a working bypass PoC. In about thirty minutes. On a desktop box. I have a version of that box. So I went and set it up. The model is Qwen3.8-27B . Artificial Analysis has it as the top open-weights model in the 4B–40B class out of 135 models, at 52 on their intelligence index. The hardware in the article was a Lenovo ThinkStation PGX — NVIDIA Grace Blackwell, 128 GB unified memory, 273 GB/s. Mine is an ASUS Ascent GX10 https://www.asus.com/us/networking-iot-servers/desktop-ai-supercomputer/ultra-small-ai-supercomputers/asus-ascent-gx10/ , which is the same GB10 silicon in a different box. I’ve been building toward this for a while. In May I wrote that AI inference costs are the wake-up call for 2026 and 2027 https://blog.herlein.com/post/ai-inference-costs-reality-check/ . In July I argued that tokens should be NRE, not COGS https://blog.herlein.com/post/tokens-are-nre-not-cogs/ . Earlier this month I benchmarked the GX10 against a ZBook Ultra G1a https://blog.herlein.com/post/gx10-vs-zbook-g1a-coding-agent/ on a real agentic coding task and came away convinced the small box is the one you actually reach for. This post is the missing piece: the actual setup. What follows is the recipe I ran, corrected against a real GX10 bring-up, including the parts that bit me. Before You Start: Two Things That Will Ruin Your Day Disk. You need about 100 GB free. The base container image alone is 57 GB, weights are ~19 GB, caches on top of that. df -h ~ Free the unified memory first. This is the one that got me. SGLang runs at --mem-fraction-static 0.90 , which claims ~90% of system RAM. Anything else already resident will collide — and on GB10 that collision doesn’t produce a nice error, it produces a hard reboot during CUDA-graph capture. The usual culprit is ollama , which pins its model in unified memory and sits there. nvidia-smi check the Processes list at the bottom sudo systemctl stop ollama sudo systemctl disable ollama stop it grabbing memory on boot nvidia-smi want: "No running processes found" free -h want: ~100+ GB free GB10 quirk: nvidia-smi reports Memory-Usage: Not Supported in the summary table. That’s normal for unified memory — it’s not broken. Read theprocess listat the bottom, or use free -h . Also note free -h shows about 121 GB , not 128 — firmware and system reserve the rest. At 0.90 that means SGLang takes ~109 GB with comfortable headroom. Don’t “fix” this. 0.95 reboots the box. OS and Stack Check The GX10 ships DGX OS, but a stock Ubuntu 24.04 LTS arm64 install works fine and is fully supported — driver, CUDA, Docker, Container Toolkit all run natively. Mine’s Ubuntu. Confirm what you have: cat /etc/os-release Ubuntu 24.04 noble or DGX OS — either is fine docker version arm64 engine; 29.x is current nvidia-ctk --version NVIDIA Container Toolkit present nvidia-smi GB10 visible, driver loaded A healthy box: NVIDIA GB10 , driver 580.x, CUDA 13.x, Docker 29.x linux/arm64 , Container Toolkit 1.19.x. If Docker or the toolkit are missing: sudo apt update sudo apt install -y docker.io sudo systemctl enable --now docker sudo usermod -aG docker "$USER" log out and back in after this sudo nvidia-ctk runtime configure --runtime=docker sudo systemctl restart docker Optionally set a Hugging Face token for faster pulls: echo 'export HF TOKEN=hf xxxxxxxxxxxxxxxxx' ~/.bashrc && source ~/.bashrc Clone and Configure cd ~ git clone https://github.com/MiaAI-Lab/Qwen3.8-27B-SGLang-DGX-Spark.git cd Qwen3.8-27B-SGLang-DGX-Spark cp .env.sample .env The defaults are sane for code work: NVFP4 weights, native 262K context, YaRN off, 16 concurrent requests. One hard rule: keep YARN=0 and CONTEXT LENGTH=262144. DFlash2 is not compatible with YaRN context extension on this build. A larger context leaking into the draft config throws AttributeError ... max position embeddings at boot and you’ll spend an hour thinking it’s a driver problem. Confirm before you launch: grep -E '^YARN|^CONTEXT LENGTH' .env Also: the repo hardcodes PORT=8888 and SERVED MODEL NAME=qwen3.8-27b-sglang . Overriding either one requires patching start.sh . I didn’t bother — I use 8888 and read the served model id from /v1/models . The patch is a two-line change if you want it; I put it at the end. One caveat worth saying out loud: this upstream repo is new and moving. Sanity-check script names and .env keys against the current README before you run anything. Don’t trust my transcription over their repo. Build and Launch Build the DFlash2 image — a pure local overlay onto the pinned SGLang image, with every overlaid file checksum-verified: php ./patch/build-dflash2-image.sh --minimal - lmsysorg/sglang:qwen38-27b-dflash2-minoverlay First run pulls ~57 GB. Go do something else. Take a nap. Or a walk. It takes a bit, even with a fast network. Then launch: DF EXTRA="--sleep-on-idle" \ IMAGE=lmsysorg/sglang:qwen38-27b-dflash2-minoverlay \ ./start-dflash.sh --sleep-on-idle matters more than it looks. Without it the SGLang scheduler busy-spins at ~97% CPU doing nothing , which on a small fanless-ish box you can hear and feel. First boot downloads weights and compiles kernels: 10–20 minutes, mostly silent. Weight load alone is about 5 minutes. Warm restarts are 2–3 minutes. Watch it in another pane: tail -f .sglang.log You’re up when you see Uvicorn running on http://0.0.0.0:8888 and Application startup complete . Verify Fair warning on the first thing that’ll confuse you: curl -s swallows connection errors, so an empty reply piped to json.tool gives you Expecting value: line 1 column 1 . That almost always means not listening yet , not crashed. Check docker ps and the log before you panic. PORT=8888 Is it up? Also grabs the real served model id. MODEL=$ curl -s http://127.0.0.1:$PORT/v1/models \ | python3 -c 'import sys,json;print json.load sys.stdin "data" 0 "id" ' echo "Serving model id: $MODEL" A code-shaped call with thinking OFF — the fast lane: curl -s http://127.0.0.1:$PORT/v1/chat/completions \ -H 'Content-Type: application/json' -d "{ \"model\": \"$MODEL\", \"messages\": {\"role\":\"user\",\"content\":\"Write an idiomatic Go function that returns the nth Fibonacci number iteratively.\"} , \"max tokens\": 300, \"temperature\": 0.2, \"chat template kwargs\": {\"enable thinking\": false}, \"stream options\": {\"include usage\": true} }" | python3 -m json.tool Logs are tail -f .sglang.log or docker logs -f qwen3.8-27b-sglang . Stop with ./stop.sh . Pointing Your Agents At It The server exposes three protocols on http://