<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>josie.lol</title>
  <subtitle>Browse aymeric&#39;s, an independent, searchable archive of readable snapshots from followed feeds, preserved in Git with aggr.</subtitle>
  <id>https://aggr.aymericbeaumet.com/sources/josie.lol/</id>
  <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/sources/josie.lol/"/>
  <link rel="self" type="application/atom+xml" href="https://aggr.aymericbeaumet.com/sources/josie.lol/atom.xml"/>
  <updated>2026-10-19T21:08:18+00:00</updated>
  <author>
    <name>aymeric&#39;s</name>
  </author>
  <generator version="2.0.0" uri="https://github.com/aymericbeaumet/aggr">aggr</generator>
  <entry>
    <id>urn:aggr:item:6ed666f321ce2d14aa788dd5c6dd94f09e8d924c</id>
    <title type="text">Putting Linux on my RTX Spark laptop because I don&#39;t have a Microsoft account</title>
    <link rel="alternate" type="text/html" href="https://aggr.aymericbeaumet.com/items/hnrss-org/2026-10-19-putting-linux-on-my-rtx-spark-laptop-because-i-don-t-have-a/"/>
    <link rel="via" type="text/html" href="https://josie.lol/blog/linux-rtx-spark"/>
    <published>2026-10-19T21:08:18+00:00</published>
    <updated>2026-10-19T21:08:18+00:00</updated>
    <author>
      <name>pfeifferj</name>
    </author>
    <category term="news"/>
    <category term="linux, arch-linux, arm64, nvidia, rtx-spark, asus, benchmarks"/>
    <source>
      <title>Hacker News: Front Page</title>
    </source>
    <summary type="text">tl;dr - boo hoo microsoft bad. Arch Linux works, keeps up with Windows in 7-Zip, and reports the same 116.0 GiB memory pool to the OS and CUDA. My initial bootable setup and patches are here. This is for the ASUS ProArt P16 H7607BA-SE033W:…</summary>
    <content type="html">&lt;p&gt;tl;dr - boo hoo microsoft bad. Arch Linux works, keeps up with Windows in 7-Zip, and reports the same 116.0 GiB memory pool to the OS and CUDA. My initial bootable setup and patches are &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/pfeifferj/archlinuxarm-proart-p16&quot;&gt;here&lt;/a&gt;. This is for the ASUS ProArt P16 H7607BA-SE033W: the 128 GB RAM configuration with 6,144 CUDA cores and a 2 TB SSD.&lt;/p&gt;
&lt;p&gt;&lt;picture class=&quot;article-picture article-picture-fallback&quot; style=&quot;--image-ratio:16 / 9&quot;&gt;&lt;img src=&quot;https://josie.lol/blog/images/n1x-arch-linux.jpg&quot; alt=&quot;Fastfetch showing Arch Linux ARM on the ASUS ProArt P16 with an NVIDIA N1X GPU.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;high&quot; referrerpolicy=&quot;no-referrer&quot; class=&quot;progressive-image&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;When rumours started circulating about a laptop with over 100 GiB of RAM the GPU could access, I started thinking about all the things I could build on it and all the optimisations I could spend far too long playing with. I&#39;m very pro open-weight models. Being able to run things locally and mess around with RL, quantisation and fine-tuning on a laptop would be sick. I already publish &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://huggingface.co/pfeifferj&quot;&gt;my own GGUF quants on Hugging Face&lt;/a&gt;, with over 160,000 downloads in the past month.&lt;/p&gt;
&lt;p&gt;So I was less pleased to find out about the &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.asus.com/laptops/for-creators/proart/proart-p16-h7607/techspec/&quot;&gt;Windows-only official support&lt;/a&gt;. There are plenty of reasons to hate Windows. Mine include &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.microsoft.com/en-us/windows/get-windows-11&quot;&gt;the&lt;/a&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://blogs.windows.com/windows-insider/2022/02/16/announcing-windows-11-insider-preview-build-22557/&quot;&gt;privacy&lt;/a&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://blogs.windows.com/windows-insider/2025/03/28/announcing-windows-11-insider-preview-build-26200-5516-dev-channel/&quot;&gt;concessions&lt;/a&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://blogs.windows.com/windows-insider/2025/10/06/announcing-windows-11-insider-preview-build-26220-6772-dev-channel/&quot;&gt;during&lt;/a&gt; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.windowslatest.com/2026/10/13/one-click-let-you-escape-microsofts-forced-sign-in-on-windows-11-of-course-microsoft-killed-it/&quot;&gt;setup&lt;/a&gt;, the years spent waiting for Microsoft to &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://blogs.windows.com/windows-insider/2026/05/15/improving-windows-quality-making-taskbar-and-start-more-personal/&quot;&gt;let people put the taskbar on the side of the screen again&lt;/a&gt;, and &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://i0.wp.com/pureinfotech.com/wp-content/uploads/2024/04/windows-11-advertisement-experience-hero-mauro-huculak.webp?fit=827%2C551&amp;amp;quality=78&amp;amp;ssl=1&amp;amp;strip=all&quot;&gt;the advertising&lt;/a&gt;. That last link is a collage of real Windows promotions, &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://pureinfotech.com/remove-ads-windows-11/&quot;&gt;courtesy of Pureinfotech&lt;/a&gt;. You get it. I can go on forever, so let me stay on topic.&lt;/p&gt;
&lt;p&gt;Arch is my preferred distribution, and I&#39;m &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://archlinux.org/people/package-maintainers/#josie&quot;&gt;on the Arch staff as a package maintainer&lt;/a&gt;. I already put it on IBM mainframes (&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://josie.lol/talks/slides/fosdem-bru-mainframe.pdf&quot;&gt;my FOSDEM slides&lt;/a&gt;), so it was always going to be my starting point here. This build uses &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://archlinuxarm.org/about&quot;&gt;Arch Linux ARM&lt;/a&gt;, the separate project that ports Arch packages to ARM, with the hardware support added on top.&lt;/p&gt;
&lt;p&gt;NVIDIA has been doing kernel work for Ubuntu, which gave me a starting point. I incorporated that, fixed the ACPI override allocation and framebuffer mapping needed to get a console, and worked out the ACPI overrides from the laptop&#39;s own tables (thanks astra &amp;lt;3). The NVIDIA driver and ASUS speaker firmware came from &lt;em&gt;official places on the internet&lt;/em&gt; (pls don&#39;t sue me computer companies). Keyboard support needed a patched &lt;code&gt;hid-asus&lt;/code&gt;, and audio needed its own machine driver.&lt;/p&gt;
&lt;p&gt;I put this together into a bootable USB and extended upstream Archinstall 4.5 to install the hardware support. The &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://github.com/pfeifferj/archlinuxarm-proart-p16&quot;&gt;repo has the build scripts and patches&lt;/a&gt;, including the steps to dump your own ACPI tables and extract the speaker firmware from ASUS&#39;s driver package locally. Mine runs firmware H7607BA.300.&lt;/p&gt;
&lt;p&gt;The build inputs are hash pinned. The hardware packages I put together over the weekend are signed with my Arch Linux Package Maintainer key, and the ACPI overrides come from the laptop itself.&lt;/p&gt;
&lt;p&gt;The display runs at 3840 × 2400 and 120 Hz, and I use NetworkManager, PipeWire, and rootless Podman with NVIDIA CDI. The installer holds the kernel, NVIDIA, power-management and firmware packages with &lt;code&gt;IgnorePkg&lt;/code&gt;, while ordinary packages keep updating from Arch Linux ARM.&lt;/p&gt;
&lt;h2&gt;CPU performance&lt;/h2&gt;
&lt;p&gt;I ran the suite on October 19 on native Arch Linux ARM, with kernel &lt;code&gt;7.0.0-1022-nvidia&lt;/code&gt; and NVIDIA driver &lt;code&gt;615.78.08&lt;/code&gt;. The laptop was plugged in with the performance profile selected. For the CPU comparison, I used published Windows results.&lt;/p&gt;
&lt;p&gt;The CPU test is native ARM64 7-Zip 26.04 with a fixed 32 MiB dictionary. I ran one warmup and three measured passes at each thread count, then took the medians:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Threads&lt;/th&gt;
&lt;th&gt;Compression (MiB/s)&lt;/th&gt;
&lt;th&gt;Decompression (MiB/s)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;6.18&lt;/td&gt;
&lt;td&gt;118.26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;141.77&lt;/td&gt;
&lt;td&gt;1,629.60&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.storagereview.com/review/hp-omnibook-ultra-16-review-rtx-spark-n1x&quot;&gt;StorageReview tested a 128 GB HP OmniBook Ultra 16&lt;/a&gt; with the same 20-core N1X, running native Windows ARM64 binaries. They report 7-Zip ratings in GIPS, so I divided the MIPS ratings in my raw logs by 1,000 to match. Higher is better.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;7-Zip workload&lt;/th&gt;
&lt;th&gt;My ProArt, Linux (GIPS)&lt;/th&gt;
&lt;th&gt;HP OmniBook, Windows (GIPS)&lt;/th&gt;
&lt;th&gt;Difference&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1-thread compression&lt;/td&gt;
&lt;td&gt;7.221&lt;/td&gt;
&lt;td&gt;7.31&lt;/td&gt;
&lt;td&gt;−1.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1-thread decompression&lt;/td&gt;
&lt;td&gt;10.779&lt;/td&gt;
&lt;td&gt;10.87&lt;/td&gt;
&lt;td&gt;−0.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20-thread compression&lt;/td&gt;
&lt;td&gt;165.754&lt;/td&gt;
&lt;td&gt;157.9&lt;/td&gt;
&lt;td&gt;+5.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20-thread decompression&lt;/td&gt;
&lt;td&gt;148.471&lt;/td&gt;
&lt;td&gt;144.5&lt;/td&gt;
&lt;td&gt;+2.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Single-thread is basically a tie. With all 20 threads, my Linux setup is about 5% ahead on compression and 3% ahead on decompression. The HP review doesn&#39;t specify its 7-Zip version or dictionary size, so these percentages compare the two laptop setups.&lt;/p&gt;
&lt;p&gt;&lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.computerbase.de/artikel/notebooks/nvidia-rtx-spark-n1x-test.99679/seite-3&quot;&gt;ComputerBase also tested a ProArt P16 with the 20-core N1X&lt;/a&gt;. Converted to GIPS, its Windows 7-Zip score was 155.774; the median total from my three runs was 157.084. Their result sits inside my three-run range of 155.759 to 157.193 GIPS. Their machine was the 64 GB configuration and ran 7-Zip 26.00, and the chart doesn&#39;t give the dictionary size.&lt;/p&gt;
&lt;h2&gt;The memory split&lt;/h2&gt;
&lt;p&gt;The memory is a bigger flex. My Linux run reports 116.0 GiB as both system RAM and CUDA&#39;s total, from the same physical pool. Windows &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://docs.nvidia.com/rtx-spark/rtx-spark-porting-guide/latest/uma/index.html&quot;&gt;divides the RAM into dedicated GPU, shared, and CPU-only regions&lt;/a&gt;. CPU workloads can&#39;t use the dedicated GPU region, and GPU allocations can&#39;t use the CPU-only region.&lt;/p&gt;
&lt;p&gt;The Windows NVIDIA app lets you change the dedicated reservation and reboot; &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.frandroid.com/test/3283093_test-nvidia-rtx-spark&quot;&gt;Frandroid&#39;s 128 GB ProArt P16 reached 96 GiB&lt;/a&gt;. CUDA can go beyond that by &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://docs.nvidia.com/rtx-spark/rtx-spark-porting-guide/latest/uma/umacuda.html&quot;&gt;allocating from shared RAM&lt;/a&gt;, subject to Windows&#39; memory budget.&lt;/p&gt;
&lt;p&gt;With a 91 GiB dedicated reservation, Frandroid&#39;s Windows setup reported a CUDA total of 109.7 GiB, including shared memory. My Linux setup reported 116.0 GiB, about 6.3 GiB more. What I care about is having the large pool available for CPU work too, without moving the reservation slider and rebooting between workloads.&lt;/p&gt;
&lt;h2&gt;Running Qwen locally&lt;/h2&gt;
&lt;p&gt;I ran NVIDIA&#39;s &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://huggingface.co/nvidia/Qwen3.8-Flash-Next-FP4-Local&quot;&gt;Qwen3.8-Flash-Next-FP4-Local checkpoint&lt;/a&gt; through vLLM with B12X CUDA kernels in a native ARM64 container, using mixed quantization and FP8 KV cache. I turned off thinking for this run.&lt;/p&gt;
&lt;p&gt;Before loading the model, Linux reported 110.9 GiB of available RAM. vLLM logged 68.2 GiB for model loading and allocated another 21.1 GiB to the KV cache. That&#39;s nearly 90 GiB allocated to the model and KV cache on a laptop.&lt;/p&gt;
&lt;p&gt;Model loading and compilation took about 16 minutes before the first request. The timings below start after warmup. PLE embedding tables are backed by disk and benefit from a warm page cache; other components use CPU offload. CUDA handles inference, with some of the model outside GPU memory.&lt;/p&gt;
&lt;p&gt;I gave Qwen two buggy Python helpers to review, a long incident log with one failed operation to find, and a payment note to turn into JSON. Each task ran three times after warmup, with known answers to check against. I wanted to know how long I&#39;d wait and whether it returned the right fields.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Input tokens&lt;/th&gt;
&lt;th&gt;First token, median (s)&lt;/th&gt;
&lt;th&gt;Complete response, median (s)&lt;/th&gt;
&lt;th&gt;Checks passed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Python code review&lt;/td&gt;
&lt;td&gt;208&lt;/td&gt;
&lt;td&gt;0.316&lt;/td&gt;
&lt;td&gt;4.008&lt;/td&gt;
&lt;td&gt;3/3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Find the failure in a 128-record incident log&lt;/td&gt;
&lt;td&gt;9,775&lt;/td&gt;
&lt;td&gt;4.532&lt;/td&gt;
&lt;td&gt;5.768&lt;/td&gt;
&lt;td&gt;3/3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payment-note extraction&lt;/td&gt;
&lt;td&gt;87&lt;/td&gt;
&lt;td&gt;0.256&lt;/td&gt;
&lt;td&gt;2.035&lt;/td&gt;
&lt;td&gt;3/3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The incident task read nearly 10,000 tokens and returned the correct request, cause, and next action in under 6 s. Its answer was only 39 tokens long, which comes to 6.8 tokens/s over the whole request. Most of the wait went into processing the prompt, so for this task the response time tells me more than the tokens/s figure.&lt;/p&gt;
&lt;p&gt;For code review, I estimated generation speed as &lt;code&gt;(output tokens − 1) / (response time − time to first token)&lt;/code&gt;, with both times in seconds. This includes stream overhead. &lt;a target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; href=&quot;https://www.frandroid.com/test/3283093_test-nvidia-rtx-spark&quot;&gt;Frandroid ran Qwen3.8-Flash-Next coding tasks on its Windows ProArt&lt;/a&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;System&lt;/th&gt;
&lt;th&gt;Quant and runtime&lt;/th&gt;
&lt;th&gt;Generation (tokens/s)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;My ProArt P16, Linux&lt;/td&gt;
&lt;td&gt;FP4-Local, vLLM B12X&lt;/td&gt;
&lt;td&gt;30.9 (median of 3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frandroid&#39;s ProArt P16, Windows&lt;/td&gt;
&lt;td&gt;UD-IQ4_XS, llama.cpp&lt;/td&gt;
&lt;td&gt;29.4 and 31.4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Both ProArt setups are around 30 tokens/s. For inference, Frandroid used an 85 GiB dedicated reservation and a context limit of 262,144 tokens; my context limit was 32,768 tokens. The prompts, quants, runtimes, and timing methods differ. This compares two working configurations; it doesn&#39;t isolate the effect of the OS.&lt;/p&gt;
&lt;p&gt;I also sent four code reviews at once. The median batch finished in 5.314 s, producing 86.6 output tokens/s across all four requests combined. That rate includes prompt processing and response overhead. All 12 answers passed over three batches.&lt;/p&gt;
&lt;p&gt;Then I left it cycling through the three tasks, one request at a time, for ten minutes. It finished 150 requests, 50 of each, and every answer passed the checks. Median response times were 4.036 s for code review, 5.921 s for the log, and 2.046 s for extraction. Comparing the first ten and last ten repetitions of each task, median response times grew by less than 1.6%.&lt;/p&gt;
&lt;p&gt;All 171 measured responses passed the checks. That&#39;s three prompts repeated with deterministic decoding; the code-review check verifies the regression outputs. I kept every answer and raw event stream and checked them against the summaries.&lt;/p&gt;
</content>
  </entry>
</feed>
