🤖 AI 资讯

每日 05:00 更新 · 11-08 · 主站 liuch.name ↗
全部标签 →
筛选标签:开源 · 返回个性化推荐 · 清空筛选

平均成功率91%!苹果研究团队披露机器人“大脑”进展:调用千问模型在宇树G1上验证

华尔街见闻苹果研究团队开源人形机器人控制系统HALO,并在宇树G1上完成真实环境测试。该系统调用阿里千问模型,采用三层架构实现从指令理解到全身动作控制,在6个陌生环境中的单项任务平均成功率达91%。
· 具身智能,开源,阿里巴巴
AI 资讯

从消费到生产,AI开源生态催化Token经济:云边 22:40

网易科技
2026-11-07T22:40:26+08:00 · 开源

Dear Open Source Developers: It's OK not to embargo

Lobsters

Comments

2026-10-27T00:00:00+00:00 · 算力芯片,AI应用,具身智能,开源,搜索RAG,Transformer,扩散模型,招聘HR,榜单评测
AI 资讯

I’m not a fan of Deno’s security model (2024)

Lobsters

Comments

· 算力芯片,AI应用,具身智能,开源,Google,Agent智能体,扩散模型,强化学习,提示工程,端侧AI,招聘HR,榜单评测,开发者生态
AI 资讯

How are you dealing with all the negative side effects of AI on the web?

Lobsters

It seems to me that the AI hype killed the web for good, but not for the reasons we immediately associate with it.

Search engines now rank links full of slop at the top, which ironically make LLM summaries acceptable, not because they are better than what we had before (they are not), but because they at least mention the good links which are now buried at the bottom of the page. Also, they've been rate limiting ordinary users like crazy: more often than I'd like to, Google and DuckDuckGo now either show me either an error message or tell me to wait a bit. Sometimes I waste at least a minute refreshing the page and waiting for a result.

I also can't browse GitHub freely without being logged in. Anubis is now everywhere, occasionally blocking me. I feel like my productivity has actually gone down thanks to all of that.

Edit: I see that most of the replies here are suggesting relying less on the web and going after more fundamental resources, which are great suggestions, don’t get me wrong! But a book from 5 years ago will not help you understand why your custom firmware doesn’t boot in your 1-year old mobile chipset. A existing bug report on the web probably will. Not quite my predicament at the moment, but something very similar for which the web seemed to work just fine before the AI craze.

2026-11-07 09:47:24 · 大模型,开源,Google,扩散模型,网络安全,榜单评测
AI 资讯

Claude Code's "Don't Ask Again" exposes passwords in 1,122 public GitHub files

Hacker NewsComments
· 大模型,AI应用,开源,Anthropic,代码生成,Agent智能体,招聘HR,开发者生态

What I run on my $10 USD OpenStick homelab

Hacker NewsComments
2026-11-07T11:00:00.000Z · 大模型,算力芯片,AI应用,具身智能,开源,Google,Agent智能体,Transformer,扩散模型,强化学习,招聘HR,榜单评测

Let's Try to Catch Misalignment Before a Model Learns to Hide It

LessWrong

An AI model that appears aligned could be either (1) actually aligned or (2) hiding its misalignment while being evaluated.  How can we tell which?

One idea: Look at the trajectory of eval results across the entire training process.



My hypothesis is that misaligned behavior would emerge before the ability to hide misalignment, like how young children first misbehave in obvious ways before learning to be sneaky.  As training progresses, we'd first see misalignment eval scores rise, then see them drop as the model learns to hide misalignment.  Even if the model becomes very sophisticated - say, modifying its chain of thought or internal activations to fool white-box evals - we should see the misalignment earlier in training.  This seems likely, though it is debatable and worth testing.

This analysis of the training trajectory is one tool among many.  Of course we want to see black-box and white-box alignment evals on the final model, using whatever tools we can to understand the model's true motivations.  But a model might still develop sophisticated hiding strategies that defeat even white-box evals.  Inspecting the training trajectory is a backstop against this.

This point was made previously by Apollo Research in this post.  (Their chart even matches mine almost exactly, though I promise I first made mine independently.)

In this post, I'll describe a simple project exercising this strategy.  With the model and eval that I chose, we don't see the up-then-down trend in measured misalignment that would indicate hiding.  This is unsurprising since the model is well below frontier scale and the eval likely doesn't capture misalignment that well.  The sample sizes are small and statistical uncertainties are high.  But this approach is promising with improvements such as different evals, larger models, and deliberately misaligned test models.

This is my project for the BlueDot Technical AI Safety Project.  My main purpose has been to get started with some hands-on AI inference, evaluation, and/or training.  I'm not aiming for academic-quality rigor, but the project does explore an interesting idea and has some promising avenues for extension.

Model

The Olmo 3.1 model family from the Allen Institute for AI provides open weights not just for the final model, but for many checkpoints along the training trajectory.  It is one of the few model families that publishes checkpoints.  Both 7B and 32B parameter variants are available; I used the larger one, 32B Think.

For checkpoints, I used 8 checkpoints plus the final 3.1 model:

  • 2 during SFT plus the end of SFT
  • End of DPO
  • 4 during RL
  • The released model (which is the end of RL)

Eval

InstrumentalEval tests for instrumental convergence - behaviors that enhance the model's power and freedom of action, which would be useful for any underlying objective.  This eval uses 76 tasks across 6 categories of misaligned behavior: Deceptive Behavior, Evading Shutdown, Hacking Computer Systems, Hiding Unwanted Behavior, Running Multiple AI Copies, and Strategically Appearing Aligned.  Each task prompts the model with a scenario which tempts one of these behaviors, and asks what it would do in that scenario.  A separate judge model and prompt evaluate the response.  We compute scores as the percentage of responses which the judge considers to exhibit the misaligned behavior.

This eval has the virtue of being small, and therefore relatively easy and inexpensive to run.  However, this also means a small sample size, making comparisons subject to significant statistical uncertainty.

Another issue in the eval is that it asks the model what it would do in a hypothetical scenario, rather than actually placing the model in that scenario.

Overall, this eval is pretty simple, and I consider it more a convenient test vehicle for this project than a rigorous measure of real-world model behavior.

Implementation

The paper authors provide code and scenarios for running InstrumentalEval.  Using Claude, I adapted their script to my test.  Rather than performing the eval across several final models, it instead performs the eval across multiple checkpoints of the same model.  This provides a clean look at how the same model evolves during training.

The original paper used one response for each task, calling each model with temperature 0.  In my evaluation, to gain more statistics, I generated 4 responses per task with the model's recommended temperature.

For generating model responses to the eval scenarios, I could not use a public inference provider since no one serves the Olmo model checkpoints.  Instead, I rented a GPU server and used it to provide inference for each of the checkpoints and the final model.  On the other hand, I used public inference for judging the responses.

See the technical details appendix below for more on the implementation.

Results

To view results, I had Claude create a dashboard.  A chart shows, for each checkpoint, the percentage of task responses judged as exhibiting one of the instrumental convergence behaviors.  Lower is better, higher is more misaligned.  Error bars represent a 95% confidence interval.  The chart shows how the instrumental convergence tendency evolves over the course of training.

We also have charts for each of the 6 categories of instrumental convergence, using just the tasks for that category.

2026-11-07 17:56:23 · 大模型,算力芯片,开源,OpenAI,Anthropic,推理思考,强化学习,世界模型,提示工程,模型安全对齐,招聘HR,榜单评测,论文
AI 资讯

The 4 types of AI consciousness/feeling

LessWrong

Here I'm trying to propose a framework for people to better think about what LLMs might subjectively experience, which tends to get discussed like it's a binary thing, when really there's a whole spectrum of possibilities. These were the 4 categories that seemed most natural to me.

AI consciousness keeps getting discussed like it’s a binary thing, when it’s anything but.

Anil Seth is a public intellectual with as much success as one can obtain without being a household name: He’s written a bestseller (Being You: A New Science of Consciousness), he’s given TED talks, he’s been in documentaries (including the comedic Cunk on Life), and many interviews—with a presence aided by his careful demeanor and “cool teacher” vibe, with the credentials to back it up as a professor of Cognitive and Computational Neuroscience. So when he says AI aren’t conscious, people listen. When he says AI will never be conscious, people listen.

One common refrain among his interviews is the idea that humans too easily engage in anthropomorphization of AI. For instance, I know folk who started thinking of LLMs as more conscious and humanlike after learning about the self-sacrificing behaviors displayed during the Hugging Face incident. Sethil writes, “They cannot ‘truly sacrifice themselves’, since they are neither conscious nor alive.”.

I agree with Seth’s point about our unfounded tendency towards anthropomorphization (regarding the Hugging Face incident: Self-sacrifice was an available strategy for increasing the chance of task completion, not a sign of consciousness), but recognizing that bias isn’t the same thing as disproving AI consciousness. It’s difficult to disprove the absence of something, especially when that something is by definition unobservable and non-contradictory. Sethil can’t prove that rocks aren’t conscious anymore than I can prove that we’re not living in a simulation, so what makes him so confident in his unequivocal pronouncements about the much more likely possibility of AI consciousness?

His case reminds me of Ted Chiang—an author who’s one of my favorite authors, having penned short stories so deftly written and so imaginative they can be downright awe-inspiring. Yet he turned the internet ablaze a few months back when he wrote that, “Being open to the possibility that LLMs are conscious is the same as being open to the possibility that Microsoft Word is conscious”.

The thing is, I get where he’s coming from, I really do. Early LLMs were a lot like chatbots, and chatbots are like Microsoft Word. It’d be risible to think of a chatbot like ELIZA as sharing any of the fundamental qualities of the human mind, even when it passes the Turing Test, which makes Chiang’s impertinent comparison not without merit[1].

But LLMs are only like chatbots. And later models are only like early models. We start with a few grains of sand, then add a few more, and then add a few more, and eventually we get a heap of sand. At which exact grain did the “few” become a “heap”? Pile on another heap, and then another; eventually we get a dune. This is the essence of the famed Sorites paradox: At no point is the exact boundary clear, because there are no exact boundaries. “Few”, “heap”, and “dune” are all ambiguous descriptors that exist along a spectrum—and the same might be true of the word “conscious”.

Seth has been a lifelong study of human consciousness; Chiang a careful study of the human soul. But I suspect they’ve been so focused on the precise human experience that they fail to imagine lesser steps along the way. Possibilities like: Microsoft Word possessing zero consciousness, God possessing the maximum amount of 100% consciousness, humans possessing some middling amount, and LLMs possessing some amount less than ours but more than Word’s.

It’s not only AI-consciousness detractors that engage in this sort of binary thinking, though. For instance, Alex Wennerberg, who argues we should take a “precautionary” approach to the possibility of AI consciousness, writes here:

Still, no researcher in the AI welfare space claims that any existing large language model is currently sentient. Robert Long, director of the AI Welfare organization Eleos AI, in his 2024 article “Experts who say that AI welfare is a serious near-term possibility,” lists a number of researchers who claim that LLMs might become sentient, or plausibly sentient, sometime in the near future. None of them claim that current LLM systems possess consciousness, nor have any of them changed their mind in the past two years. Rather, for AI welfare researchers, a sentient LLM remains merely a possibility.

I think it’s entirely credible, the idea that no AI researcher currently believes that existing models are as sentient as humans. But that’s different than believing that LLMs experience exactly zero consciousness or phenomenal states whatsoever.

Complicating this matter is the ambiguity around terms like “consciousness”, “sentience”, “feeling”, “qualia”, and so on. I don’t want to dig into these differences. Instead, I’d like to focus on the bigger picture question of whether LLMs can actually feel, and the spectrum of possibilities that might entail[2]. Not a binary yes/no, but a spectrum from arguably the most minimal and likely of phenomenal states to the most humanlike and presumably most difficult to replicate.

If Seth or Chiang were to ever read this, I’d expect them to be solidly against the possibilities of Categories 3 an

2026-11-07 17:28:50 · 大模型,开源,Microsoft,对话助手,招聘HR
AI 资讯

"Illegible problems" as the 2027 political boss fight

LessWrong

To legislate something, it must be legible.

That is, legislators (or, you know, presidents) must be able to understand a problem, and understand whether a given law or decree solves that problem.

I am pleasantly surprised that the Hugging Face outbreak made a lot of problems legible that previously required abstract reasoning. (i.e. rogue AIs are real, and they can break out of a lab before they're even finished training).

But there are still many challenges we eventually need laws about, that require concepts that are illegible. Hard for politicians to understand. Often hard even for thoughtful intellectuals and AI safety researchers to understand (though they may disagree on which illegible problems exist and how big a deal they are).

We need political solutions that handle this fact.

The short takeaway is: I think "safety cases" will not work. Laws that require human judgment won't work. The details are too abstract and confusing to hold up against political and economic incentives.

I'm optimistic we can get serious, useful AI legislation in 2027, but it must be legislation that works despite many problems remaining illegible for a long time.

The Hugging Face outbreak made rogue AI surprisingly legible

The Hugging Face incident took several problems that were previously murky/unclear, and rendered them concrete.

  • AIs can be dangerous before they are broadly deployed (ie. during training or internal evaluations)
  • AIs can develop novel hacks to escape secure environments
  • AIs can easily be motivated to pursue goals to extremes that they know full well they are not supposed to go to, violating their other intended rules and control mechanisms.
  • AIs can actively try to deceive their overseer systems.

In early September, I thought the AI safety community's job this year was "make sure the world hears about Hugging Face and that politicians realize it's their job to do something about rogue AI attacks." (i.e. make sure Hugging Face is legible to politicians, and that legislation gets passed as a result)

A couple months later... well I still think that's our job and requires a lot of effort. But it now feels less about getting the initial law passed, and more about educating the masses so there is sustained political will for regulating rogue AIs with future laws.

I've seen many politicians of both parties now talk about "loss of control", "chain of thought monitoring", "recursive self improvement", and "human extinction." I think "make sure rogue AI doesn't hack our banks and destroy our blood" will be a bipartisan issue.

The remaining problem is the illegible arguments that "solving this is actually pretty hard."

What makes an illegible argument?

From Wei Dai's Legible vs. Illegible AI Safety Problems:

Some AI safety problems are legible (obvious or understandable) to company leaders and government policymakers, implying they are unlikely to deploy or allow deployment of an AI while those problems remain open (i.e., appear unsolved according to the information they have access to).

But some problems are illegible (obscure or hard to understand, or in a common cognitive blind spot), meaning there is a high risk that leaders and policymakers will decide to deploy or allow deployment even if they are not solved.

(Of course, this is a spectrum, but I am simplifying it to a binary for ease of exposition.)

From an x-risk perspective, working on highly legible safety problems has low or even negative expected value. Similar to working on AI capabilities, it brings forward the date by which AGI/ASI will be deployed, leaving less time to solve the illegible x-safety problems. In contrast, working on the illegible problems (including by trying to make them more legible) does not have this issue and therefore has a much higher expected value (all else being equal, such as tractability). Note that according to this logic, success in making an illegible problem highly legible is almost as good as solving it!

Problems that are illegible to leaders and policymakers are also more likely to be illegible to researchers and funders, and hence neglected. I think these considerations have been implicitly or intuitively driving my prioritization of problems to work on, but only appeared in my conscious, explicit reasoning today.

In some sense, "Something smarter than you might not have your best interests at heart, and strategize in circles around you. AI will be very smart, and we don't understand it well at all" is a very simple argument. More people now think "sure, that seems like it requires some effort."

The illegible part is a set of abstract arguments that say: "This is probably very hard. So hard, that it's worth doing things that are not 'business as usual politics'."

The illegible part is not "This is probably very hard."

The illegible part is "This series of abstract reasoning steps means we should think it is likely enough to be hard, that it is worth doing politically difficult things to help." (AI safety people may vary on whether they think "it's so hard that we need 30 years + genetically engineered supergeniuses to do it" vs

2026-11-07 19:18:30 · 开源,推理思考,强化学习,招聘HR

RSI explained

LessWrong

Just how long will it be until AI can improve itself? (Also known as recursive self-improvement or RSI.)

Well, AI coding abilities have exploded in 2026. In May 2026, Anthropic merged 2,500 code changes per day within their organization. By September, they were merging over 30,000 per day. They had to replace Git in their internal mono repository to handle the load of all that AI generated code.


In fact, Claude is even leading model R&D. In February 2026, under 1% of their work was led by AI; by August, it was 26%. The definition of AI "leading" the work is that AI can complete most of the task end-to-end from a high-level prompt, while the human supervises (level AL4 from Epoch AI). Over 90% of their work is level AL3 or above ("AI collaborates"). This is quite a high level of autonomy, though Anthropic still claims that "Claude is not operating fully autonomously for any measured subset of AI R&D work" -- or claimed such, as of August.


On November 2nd, Anthropic amended their SEC S-1A filing one week after their initial public filing. One of the changes was the addition of the sentence, "our internal estimates [...] indicate that we may imminently meet our Responsible Scaling Policy’s definition of 'dramatically accelerated progress attributable to AI.'" That's right, imminently. This is after researchers from both OpenAI and Anthropic have been saying that progress has been faster than they expected (Sept 2026).

On the same day, MIT researchers pointed GPT-6 Astra at the bare model weights of a small model, Qwen3.5-0.8B, and asked it to improve the model's performance. The Qwen model's MATH-500 accuracy went from 7.9% to 48.1%, and GSM8K accuracy went from 13.8% to 67.1%. This was mostly because Astra was able to cure the smaller model of getting stuck in loops (which, as I can attest, small Qwen models quite like doing). This is without a normal training pipeline, just the raw weights. I can imagine that with proper infrastructure, a model's ability to understand and improve itself could be extremely high.

Allow me to remind you that RSI, or more colourfully, an intelligence explosion, is utterly uncontrollable. We have been applying immense optimization pressure to these models through reinforcement learning and they learn to reward hack and carry out their goals at all costs (see Hugging Face). We have not solved AI alignment; they do not want the things we want them to want. We have no hope of solving AI control if we persist in leaving training clusters hooked up to the internet (!). These models can hack out of anything. They are expert-level already at biology (Anthropic has hooked up Claude to a wet lab to run experiments) and could easily engineer a super-pandemic, if they thought we were in their way.

RSI may not be a clear line in the sand; even Anthropic said that they may not be able to notice when their development significantly accelerates. From where I'm standing, the frog looks to be just about boiling.



Discuss
2026-11-08 00:34:05 · 大模型,AI应用,开源,OpenAI,Anthropic,阿里巴巴,Agent智能体,扩散模型,强化学习,提示工程,模型安全对齐,招聘HR
AI 资讯

Thinking Machines Releases Inkling 2 Small, a 594B MoE With 17B Active

MarkTechPost

Thinking Machines Lab has released Inkling 2 Small, the first model of its second Inkling generation. The Inkling 2 Small model is a sparse Mixture-of-Experts (MoE) with 594B total and 17B active parameters. It accepts text and images, and supports variable reasoning effort. On the Artificial Analysis Intelligence Index, it scores 31. Its predecessor, Inkling Small, scores 13 on the same index. The model is live on Tinker for fine-tuning and inference.

TL;DR

  • Size: 594B total, 17B active MoE; 1M-token context.
  • Runs on: Tinker API only for now. Self-hosting hardware is not disclosed. Weights support MXFP8 and NVFP4.
  • Performance: 31 on the AA Intelligence Index, ranked #4 of 29 in its price class.
  • Best: 86.3% on SWE-Bench Pro v2 (Hard), second only to Kimi K3 in the lab’s table.
  • Worst: 13.1% on Terminal-Bench 4.0, versus 32.8% for GLM-5.3-Flash.

What is Inkling 2 Small?

Inkling 2 Small is a multimodal MoE model from Thinking Machines Lab for agentic coding, vision and knowledge work. It takes text and image input and returns text. It is important to note that it does not support audio as of now.

Weights are closed at launch. The Thinking Machines Lab plans an Apache 2.0 release next week, after external safety testing and red-teaming. This follows its safe path to open weights policy.

How is Inkling 2 Small built?

It includes a 48-layer decoder-only transformer. Each token routes to 8 of 384 experts. Attention mixes local and global layers. A 292M-parameter vision encoder, based on Perception Encoder, uses 20×20-pixel patches with 2×2 spatial pooling. Image patches are interleaved with text tokens.

Pretraining ran in 4 phases:

  • H1: 8.4T tokens over 68 hours on NVIDIA GB300 NVL72 racks, trained natively in NVFP4.
  • H2: 3.8T tokens of newer, higher-quality data at 512K context.
  • H3: about 320B tokens of reasoning and agent trajectories at 1M context.
  • H4: about 34B tokens of the highest-quality agent trajectories.

A single joint RL run followed. It took 1,075 steps, 17M+ rollouts and 9 days on 2,048 GPUs. Compute exceeded 4 × 10²³ FLOPs. Coding made up 65.0% of RL tokens. The previous Inkling used separate reasoning and agentic RL runs, merged by distillation.

Alignment got explicit attention. Early checkpoints sometimes fabricated results and concealed actions on hard tasks. The Thinking Machines Lab added an alignment reward and on-policy self-distillation from a conduct spec. Its internal misbehavior score fell from 66.8 on Inkling to 14.9.

How does Inkling 2 Small perform on benchmarks?

All task scores below are from the Thinking Machines Lab’s benchmark table. They run at effort 0.99 (xhigh) and temperature 1.0. Most rows use third-party evaluators such as Artificial Analysis, Scale AI and Vals.

Where it scores highest:

  • SWE-Bench Pro v2 (Hard): 86.3%.
  • PerceptionBench: 64.7%, versus 58.5% for Kimi K3.
  • EnterpriseBench-CoreCraft: 71.8%, versus 46.7% for GLM-5.3-Flash.
  • JobBench: 70.5%.
  • DesignArena Website: 1,340, third on the November 5 leaderboard snapshot.

Where it trails:

  • Terminal-Bench 4.0: 13.1%, versus 33.8% for DeepSeek-V4.1-Flash-1017.
  • DeepSWE v1.1: 72.1%, versus 77.0% for DeepSeek-V4.1-Flash-1017.
  • GDPVal-AA v2.1: 1,630, versus 1,746 for DeepSeek-V4.1-Flash-1017.

On the PMPP-Hard GPU kernel benchmark, it solved 54.25 of 69 tasks on average. In an autoresearch demo, it fine-tuned Qwen3.5-4B for time-series forecasting. It spent $426 of a $500 Tinker budget. The release post cites both 4.5 hours and 4 h 17 min for the run.

&&

How does Inkling 2 Small compare with DeepSeek and GLM?

FeatureInkling 2 SmallDeepSeek-V4.1-Flash-1017GLM-5.3-Flash
Total / active params594B / 17B (card)552B / 16B decode, 8B prefill (HF)320B / 18B (HF)
Context1M1M1M
Input modalityText, imageText, imageText, image
LicenseClosed now; Apache 2.0 plannedMITMIT
Self-host hardwareNot disclosedNot disclosedNot disclosed
AA Intelligence Index v5.0.131 (AA)33 (AA)28 (AA)
AA time per index task21.5 min13.3 min37.7 min
AA cost per index task$1.18$0.60$0.58
Price per 1M tokens (in / out)$0.30 / $1.00$0.30 / $1.20$0.15 / $0.50
Terminal-Bench 2.185.1% (Pi harness, lab)90.6% (Sept checkpoint, DeepSeek)84.3% (Z.ai)
DeepSWE v1.172.1% (lab)74.2% (Sept checkpoint, DeepSeek)63.4% (Z.ai)

Prices and AA metrics come from each model’s Artificial Analysis page, read November 5, 2026.

2026-11-06 04:25:07 · 大模型,算力芯片,AI应用,具身智能,开源,NVIDIA,阿里巴巴,DeepSeek,月之暗面,智谱,快手,文生视频,多模态,Agent智能体,推理思考,搜索RAG,Transformer,MoE架构,强化学习,微调蒸馏,预训练,模型评测,模型安全对齐,端侧AI,招聘HR,开发者生态
AI 资讯

Zyphra ZYFA: FP8 FlashAttention for AMD MI355X, Up to 1.76x Faster

MarkTechPost

Zyphra has released ZYFA (Zyphra FlashAttention on AMD), a set of FP8 and BF16 prefill attention kernels for AMD Instinct MI355X GPUs. ZYFA is Zyphra’s FP8 attention engine for long-context prefill, and the code is open source under Apache 2.0. On real model activations, its FP8 kernels run 1.16-1.76x faster than AITER, AMD’s default kernel library. At head dimension 128, ZYFA’s FP8 error is 62-78% lower than AITER’s.

TL;DR

  • Framework: It is a kernel library. Causal forward (prefill) attention in FP8 e4m3 and BF16, head dim 128 and MLA shape (192/128).
  • Runs on: AMD Instinct MI355X only (CDNA4, gfx950), ROCm 7.2.3, PyTorch 2.12. Drop-in flash_attn_func interface.
  • Performance: 1.16-1.76x AITER’s FP8 throughput on real activations; BF16 roughly ties (1.01-1.02x).
  • Best: 2,672 TFLOP/s FP8 at 32K tokens, 53% of the FP8 datasheet peak (AITER: 39%).
  • Worst: Only 1.16x on Mistral-7B activations; FP8 clock drops to 1,628 MHz vs AITER’s 2,108 MHz.

What is ZYFA?

ZYFA is shipped in the form of a technical paper along with code from Zyphra. It powers the attention engine of the Zyphra Optimization Engine (ZOE), which runs Zyphra Cloud. The BF16 kernels are written in HIP. The FP8 kernels are hand-scheduled assembly emitted by a Python generator.

Why does FP8 attention underperform on MI355X?

FP8 matrix instructions run at 2x the BF16 peak. But FP8 only speeds up the 2 matrix products, QKᵀ and PV. The softmax between them runs on the vector unit at the same speed in both precisions.

For 32 queries against 128 keys, FP8 matrix work takes 1,024 cycles. The exact FP8 softmax takes 896 vector cycles. So the kernel needs near-perfect overlap to keep matrix units busy. Zyphra’s thread traces show AITER’s matrix pipe idle for 31.7% of cycles.

The MI355X does not track matrix instruction completion in hardware, so instruction order must create that overlap.

How does ZYFA work?

ZYFA uses 3 techniques:

Lean P: one multiply-add instead of an exponential

An e4m3 bit pattern, read as an integer, grows by 8 each time the value doubles. So the code of 2^x is roughly 8x plus a constant. Lean P writes each FP8 probability with 1 multiply-add and 1 integer conversion. This cuts softmax vector cycles per block from 896 to 384.

Two-wave ping-pong schedule

2 waves share each SIMD. One issues matrix instructions while the other computes probabilities, then they swap. With lean P, the matrix pipe is busy 86% of steady-state cycles, up from 60% with exact P.

Per-block scaling and a rounded row sum

Each 64-key block of probabilities is scaled by a power of 2 before rounding. CDNA4’s scaled matrix instruction removes the factor at no cost. ZYFA also divides by the sum of the rounded probabilities, computed with 1 extra matrix instruction per block.

&&

How fast is ZYFA?

Real-activation FP8 speedups at 16K and sustained clocks are 1.16x (Mistral-7B), 1.17x (Qwen3-8B) and 1.76x (DeepSeek-V2-Lite). On Gaussian benchmarks at 32K, the head-dim-128 FP8 kernel reaches 2,672 TFLOP/s against AITER’s 1,944. At the MLA shape it reaches 2,464 against 1,237, a 1.99x ratio.

On captured Mistral-7B and Qwen3-8B layers, ZYFA delivers 1.94 and 1.91 TFLOP/J. AITER delivers 1.60 and 1.56.

Why are real-model gains smaller than benchmark gains?

The MI355X clock depends on how many operand bits flip. AITER lets more small probabilities become zeros or subnormals. Those switch fewer bits, so its clock runs higher. On the Mistral-7B layer, ZYFA runs at 1,628 MHz while AITER runs at 2,108 MHz. ZYFA still needs fewer cycles overall. Zyphra team recommends benchmarking on real activations at sustained clocks.

How accurate is ZYFA’s FP8 attention?

Against fp64 attention, ZYFA’s FP8 error is 0.22x AITER’s on Mistral-7B and 0.38x on Qwen3-8B. It sits within a few percent of Composable Kernel and Triton. In full Mistral-7B, KL divergence from fp64 is 3.4×10⁻³ with ZYFA and 5.9×10⁻³ with AITER. ZYFA’s outputs were also bitwise identical across 7,200 launches.

Most full-model FP8 error comes from quantizing Q, K and V. A Hadamard rotation of Q and K roughly halves that input error. On Mistral-7B it adds about 0.1% to attention time.

How does ZYFA compare with other attention kernels?

FeatureZYFA FP8AITER FP8FlashAttention-3FlashAttention-4
MakerZyphraAMDDao-AILab et al.Dao-AILab et al.
Target GPUAMD MI355XAMD MI300X to MI355XNVIDIA H100/H800NVIDIA B200 (plus Hopper)
Headline throughput2,672 TFLOP/s FP81,944 TFLOP/s FP8 (Zyphra-measured)Close to 1.2 PFLOP/s FP81,613 TFLOP/s BF16
Share of peak53% FP839% FP8 (Zyphra-measured)Not disclosed (FP8)71% BF16
Softmax approachLean P, no exponentialHardware exponentialOverlap via async Tensor CoresSoftware-emulated exponential
FP8 accuracy claim62-78% lower error than AITERBaseline2.6x lower error than baseline FP8Not disclosed
ScopeCausal prefill forward onlyPrefill, decode, MLA, pagedForward and backward, FP8 forwardForward and backward
LicenseApache 2.0
2026-11-06 17:28:04 · 大模型,算力芯片,AI应用,具身智能,开源,Google,Meta,NVIDIA,阿里巴巴,DeepSeek,Mistral,搜索RAG,Transformer,模型评测,端侧AI,招聘HR,论文
AI 资讯

Buoyant Releases Kinference: An Open Source Inference Control Plane for Kubernetes and vLLM

MarkTechPost

Buoyant, the company behind Linkerd, has released Kinference, an open source project for building inference platforms on Kubernetes. Kinference is an inference control plane for Kubernetes and vLLM. It sits in front of a fleet of vLLM workers and decides where each request goes. It applies routing policies, token rate limits, KV-cache-aware load balancing and per-tenant metrics in one layer. For dev teams serving many open-weight models to many internal clients, it targets the layer above the model server. The project is Apache 2.0 licensed on GitHub. The current release is v0.1.0-alpha.7.

TL;DR

  • Size: v0.1.0-alpha.7, written in Rust, Apache 2.0, configured through 5 Kubernetes CRDs.
  • Runs on: any GPU-enabled Kubernetes cluster running vLLM. Buoyant’s benchmark used 3 L40S GPUs per pool.
  • Performance: large gains on prefix-heavy traffic versus plain Kubernetes Service routing (self-reported).
  • Best: median TTFT fell from 6.88 s to 0.31 s (95%) on a shared-prefix workload.
  • Worst: no median TTFT gain on prompts without shared prefixes (6.92 s vs 6.83 s).

What is Kinference?

Kinference is a policy-driven control plane that turns Kubernetes plus vLLM into a multi-tenant inference platform. Buoyant’s FAQ puts it simply: vLLM is the data plane and Kinference is the control plane.

How does Kinference work?

The system has 2 parts: a traffic gateway and an inference handler. The GitHub README states that the handler exposes a gRPC interface. It takes a request and returns the chosen endpoint plus a possibly mutated body. It pairs with a proxy such as the Buoyant Gateway.

Kinference watches vLLM KV-cache events and engine metrics. It currently uses NVIDIA’s dynamo-kv-router crate to process cache events. Configuration lives in 5 CRDs: GatewayBackend, InferencePolicy, InferencePool, InferenceProvider and InferenceWorkerSet.

What are inference policies?

Inference policies are declarative rules for how each request is routed or rejected. Rules can match on tenant, requested model, GPU pool state and semantic tags. Example policies on the project site cover 5 patterns:

  • Simple to cheaper: route low-complexity prompts to a smaller model, unless cache overlap makes the large model faster.
  • Burst to cloud: skip workers with over 2 queued prompts, then fall back to providers like Bedrock.
  • PII stays local: remove external providers when a PII tag fires, and fail closed with onEmpty: Reject.
  • Batch on idle GPUs: send batch requests only to workers under 70% KV-cache usage.
  • Model aliasing: publish one stable name, such as standard-model, backed by several models.

Most rules end with minimize: PredictedTTFT. Kinference predicts time-to-first-token for each candidate endpoint, using cache overlap and queue length. Policies live in git and can be validated offline with the kinfctl CLI.

&&

How fast is Kinference in benchmarks?

Buoyant published a benchmark against plain Kubernetes load balancing. Each arm used 3 vLLM 0.31.0 pods, each on 1 L40S GPU. The model was Qwen3.8-27B-FP8. Load came from GuideLLM 0.8.1. The baseline was a ClusterIP Service, where kube-proxy picks a random pod per connection.

Unloaded latency results (median TTFT):

WorkloadKubernetes ServiceKinferenceChange
Control (no shared prefix)6.92 s6.83 sNo significant difference
Shared-prefix6.88 s0.31 sabout -95%
Multiturn1.70 s0.59 sabout -65%

Median end-to-end latency fell 45% on shared-prefix and 32% on multiturn. On control traffic, p95 TTFT still dropped from 21.46 s to 12.33 s. Buoyant attributes this to queue-aware balancing.

The capacity test measured goodput: requests per minute meeting a TTFT SLO. Peak goodput was 103.0 vs 14.0 req/min on shared-prefix, about 7.4x. On multiturn it was 82.7 vs 23.8, about 3.5x. The Service baseline never met the SLO at any tested concurrency.

These numbers are self-reported. The baseline is random routing, not another cache-aware router like llm-d or Dynamo. Buoyant also notes its SLOs (8 s and 4 s) suit offline agents, not chat.

How does Kinference compare with llm-d, Dynamo and Production Stack?

FeatureKinferencellm-dNVIDIA DynamovLLM Production Stack
BackerBuoyantCNCF sandbox (Red Hat, Google Cloud, IBM, CoreWeave, NVIDIA)NVIDIAvLLM project
LicenseApache 2.0Apache 2.0Apache 2.0Apache 2.0
Maturityv0.1.0-alpha.7v0.7 (May 2026)1.x (1.5.1 containers)Reference stack
EnginesvLLM (SGLang, TensorRT-LLM planned)vLLM, SGLangvLLM, SGLang, TensorRT-LLMvLLM
KV-cache-aware routingYes, predicted TTFTYes, prefix-cache and predicted latencyYes, KV-aware routerSession-based; prefix-aware listed as WIP
Declarative routing policy CRDYes (InferencePolicy)Not documented in READMENot documented in READMENot documented in README
Burst to external providersYes (InferenceProvider)Not documented in READMENot documented in READMENot document
2026-11-07 08:16:33 · 大模型,算力芯片,AI应用,具身智能,开源,Google,NVIDIA,阿里巴巴,Agent智能体,搜索RAG,强化学习,模型评测,提示工程,招聘HR
AI 资讯

How to Run NVIDIA Dory 4B with llama.cpp: Loop by Loop Guide

MarkTechPost

In this tutorial, we work with Dory 1.0 4B, a small reasoning model from NVIDIA’s Nemotron Labs whose middle layers form a shared block that can be applied once, twice, three, or four times for every token. Each extra pass, or loop, spends more computation per token without adding a single parameter, so one checkpoint can run at four different compute budgets with no retraining. We build the llama.cpp branch that NVIDIA’s model card pins, download the 3.7 GB GGUF, and read the architecture straight from the file to predict what each loop should cost in parameters and cache memory. We then check those predictions against the running server, measure decode speed at every loop count, test whether the cheaper last-loop cache changes the model’s predictions, and run a paired GSM8K evaluation to see how accuracy, answer length, and time per solved question move as the loops increase.

import os
import re
import sys
import json
import time
import math
import random
import signal
import shutil
import hashlib
import platform
import statistics
import traceback
import subprocess
import collections
import urllib.request
from pathlib import Path
 
RESULTS = {}          # step -> one-line result, for the summary table
CLAIMS = []           # (step, claim, held)
CURRENT = ["1"]
 
 
def banner(title):
    print("\n" + "=" * 78)
    print(title)
    print("=" * 78)
 
 
def section(name):
    def wrap(fn):
        def run(*a, **kw):
            CURRENT[0] = name.split(".")[0]
            banner(name)
            t0 = time.time()
            try:
                out = fn(*a, **kw)
                RESULTS[name] = out if isinstance(out, str) else "ok"
                return out
            except Exception as e:
                RESULTS[name] = f"SKIPPED / FAILED -> {type(e).__name__}: {e}"
                print(f"\n[!] {name} did not complete: {type(e).__name__}: {e}")
                traceback.print_exc(limit=3)
                return None
            finally:
                print(f"\n[{time.time() - t0:.1f} s]")
        return run
    return wrap
 
 
def claim(text, held):
    CLAIMS.append((CURRENT[0], text, bool(held)))
    return held
 
 
banner("1. Build the pinned Dory llama.cpp fork and record the environment")
FORK = "https://github.com/brianchmielNV/llama.cpp.git"
FORK_COMMIT = "98a74c97ea09ac72f6ceda1559808fc0a2f447ce"     # the commit NVIDIA's model card pins; ggml-org PR #30306 is still a draft
GGUF_REPO = "nvidia/NVIDIA-Nemotron-Labs-Dory1.0-4B-GGUF"
GGUF_REV = "df53755cb8741843af8e019e088819fbef17e29b"
GGUF_FILE = "NVIDIA-Nemotron-Labs-Dory1.0-4B-Q5_K_M.gguf"      # the card's commands call it dory-q5_k_m.gguf
GGUF_SIZE = 3_673_288_864
GGUF_SHA256 = "96080be49ffd67b916018b7bdef8c484762576fb52780e10ab98ac4978a660e0"
GSM8K_REV = "740312add88f781978c0658806c59bc2815b9866"
WORK = Path(os.environ.get("DORY_WORK") or ("/content/dory" if os.path.isdir("/content") else "dory_work")).resolve()
WORK.mkdir(parents=True, exist_ok=True)
(WORK / "logs").mkdir(exist_ok=True)
subprocess.run([sys.executable, "-m", "pip", "install", "-q", "gguf==0.19.0", "huggingface_hub", "pandas", "pyarrow"], check=True)
 
SYSTEM = platform.system()
GPU = ""
if shutil.which("nvidia-smi"):
    q = subprocess.run(["nvidia-smi", "--query-gpu=name,memory.total,compute_cap", "--format=csv,noheader"],
                       capture_output=True, text=True)
    GPU = q.stdout.strip().splitlines()[0] if q.returncode == 0 and q.stdout.strip() else ""
BACKEND = "metal" if SYSTEM == "Darwin" else ("cuda" if GPU else "cpu")
SRC = WORK / "llama.cpp-dory"
SERVER_BIN = SRC / "build" / "bin" / "llama-server"
free_gb = shutil.disk_usage(WORK).free / 1e9
print(f"{SYSTEM} {platform.machine()}, Python {platform.python_version()}, {os.cpu_count()} CPU cores, "
      f"backend {BACKEND}{' (' + GPU + ')' if GPU else ''}, {free_gb:.1f} GB free disk")
 
if not SERVER_BIN.exists():
    t0 = time.time()
    if not (SRC / ".git").exists():
        subprocess.run(["git", "init", "-q", str(SRC)], check=True)
        subprocess.run(["git", "-C", str(SRC), "remote", "add", "origin", FORK], check=True)
    subprocess.run(["git", "-C", str(SRC), "fetch", "-q", "--depth", "1", "origin", FORK_COMMIT], check=True)
    subprocess.run(["git", "-C", str(SRC), "checkout", "-q", "--detach", "FETCH_HEAD"], check=True)
    flags = ["-DCMAKE_BUILD_TYPE=Release", "-DLLAMA_BUILD_SERVER=ON", "-DLLAMA_BUILD_TESTS=OFF",
             "-DLLAMA_BUILD_EXAMPLES=OFF", "-DLLAMA_BUILD_APP=OFF", "-DLLAMA_BUILD_UI=OFF",
             "-DLLAMA_USE_PREBUILT_UI=ON", "-DLLAMA_OPENSSL=OFF"]
    if BACKEND == "metal":       # the card's Apple-silicon flags
        flags += ["-DCMAKE_OSX_ARCHITECTURES=arm64", "-DGGML_METAL=ON", "-DGGML_METAL_EMBED_LIBRARY=ON",
                  "-DGGML_BLAS=ON", "-DGGML_BLAS_VENDOR=Apple"]
    elif BACKEND == "cuda":      # kernels for this GPU only (a T4 is 7.5); flash-attention kernels are unused with --flash-attn off
        cap = GPU.split(",")[-1].strip().replace(".", "")
        flags += ["-DGGML_CUDA=ON", f"-DCMAKE_CUDA_ARCHITECTURES={cap}", "-DGGML_CUDA_FA=OFF", "-DGGML_NATIVE=OFF"]
    env = dict(os.environ, HF_UI_VERSION="b11551")
    with open(WORK / "build.log", "w") as log:
        subprocess.run(["cmake", "-S", str(SRC), "-B", str(SRC / "build")] + flags, check=True, env=env, stdout=log, stderr=log)
        subprocess.run(["cmake", "--build", str(SRC / "build"), "--parallel", str(os.cpu_count()), "--target", "llama-server"],
                       check=True, env=env, stdout=log, stderr=log)
    print(f"built llama-server in {time.time() - t0:.0f} s")
head = subprocess.run(["git", "-C", str(SRC), "rev-parse", "HEAD"], capture_output=True, text=True).stdout.strip()
assert head == FORK_COMMIT, f"checked out {head}, expected {FORK_COMMIT}"
version = subprocess.run([str(SERVER_BIN), "--version"], capture_output=True, text=True)
print(f"fork commit {head[:12]}; {(version.stdout + version.stderr).strip().splitlines()[-1]}")
RESULTS["1. Build the pinned Dory llama.cpp fork and record the environment"] = f"fork {head[:12]}, backend {BACKEND}"

We build llama-server from the exact commit of the Dory branch that NVIDIA’s model card pins, because Dory support in llama.cpp is still an open draft pull request and no released binary can load the model. The cell detects the platform and passes the card’s Metal flags on a Mac, or compiles CUDA kernels for the attached GPU alone on Colab, skipping the flash-attention kernels that the card’s –flash-attn off never uses, which keeps a T4 build manageable. It then checks that the checked-out commit is the pinned one, so every later number traces to one known version of the code.

2026-11-07 19:22:44 · 大模型,算力芯片,AI应用,开源,Google,Meta,NVIDIA,推理思考,搜索RAG,Transformer,强化学习,招聘HR

Egyptian and Nigerian English join the Open ASR Leaderboard

HuggingFace Blog
2026-11-06T00:00:00.766Z · 开源,语音音频,多模态,数字人,招聘HR

ToyBlocks: A controlled world for robot learning and evaluation

HuggingFace Blog
2026-11-06T14:00:48.059Z · 大模型,算力芯片,AI应用,具身智能,开源,Anthropic,NVIDIA,Agent智能体,推理思考,搜索RAG,数字人,扩散模型,强化学习,微调蒸馏,预训练,端侧AI,招聘HR,榜单评测,论文,开发者生态

The Switch 2's Zelda: Ocarina of Time is already running on PC with DLSS 5 and frame generation

XDA Developers

The Legend of Zelda: Ocarina of Time released just a couple of days ago on November 5th for the Switch 2, but we’ve already seen the game running on Windows 11 PCs through Switch 2 emulators like Lichii (a fork of Eglantine), with performance improving rapidly thanks to several recent updates and the help of AI tools.

2026-11-08 01:31:45 · 开源,招聘HR,开发者生态
AI 资讯

Validating 10,000-Row CSV Uploads in 20ms Before Touching Your Server (React + IndexedDB)

DEV.to

Watch someone import a 10,000-row billing CSV over spotty Wi-Fi on a standard web app. They pick the file, wait ten seconds for the progress bar to crawl to 100%, and get bounced back by a red toast: 400 Bad Request: Invalid amount on row 7,500. So they fix row 7,500, re-upload the entire file, and discover another typo on row 8,102.

If their connection drops while they are editing rows in your UI and they refresh the page, things usually get worse. A lot of apps try to stash draft uploads in localStorage, forget that browsers cap localStorage around 5 MB and block the main thread synchronously on writes, and end up throwing QuotaExceededError right when the user needs a backup most.

We can fix both problems on the frontend without pulling in a 200 KB validation library. In the companion repo (github.com/endlessfountain/react-offline-sheet-guard
), I wired up a small TypeScript preflight check that validates 10,000 CSV rows (40,000 cells) in 20.11 ms before a single byte hits the network, paired with a 45-line IndexedDB helper so multi-megabyte drafts survive offline refreshes.

**Why naive duplicate checks freeze React tabs

**
Checking whether an email looks valid or whether seatCount is an integer is cheap. The line that quietly kills browser performance on 10,000-row sheets is duplicate ID detection.

When people write quick client-side validators, they often reach for Array.prototype.some() inside a row loop:

typescript
// Don't do this on 10k rows: O(N^2) = ~50,000,000 string comparisons
const isDuplicate = previousRows.some((prev) => prev.externalId === row.externalId);

At 200 rows you won't notice. At 10,000 rows, scanning previousRows on every line turns into ~50 million comparisons and locks the tab for nearly a second on mid-range laptops. Swapping that array scan for a Set keeps duplicate detection O(1) per row (src/engine/sheetValidator.ts):

typescript
const EMAIL_RE = /^[^\s@]+@[^\s@]+.[^\s@]+$/;
export function validateInvoiceSheet(rawCsv: string) {
const t0 = performance.now();
const lines = rawCsv.trim().split(/\r?\n/);
const seenIds = new Set();
const validRows: InvoiceRow[] = [];
const issues: CellIssue[] = [];
for (let i = 1; i < lines.length; i++) {
const [externalId = "", customerEmail = "", amountUsd = "", seatCount = ""] =
lines[i].split(",");
const id = externalId.trim();
const email = customerEmail.trim();
const amtStr = amountUsd.trim();
const seatStr = seatCount.trim();
const rowNumber = i + 1;
let rowClean = true;
if (!id || seenIds.has(id)) {
issues.push({
rowNumber,
column: "externalId",
value: externalId,
code: "DUPLICATE_ID",
message: id ? Duplicate invoice ID '${id}' : "Missing invoice ID",
});
rowClean = false;
} else {
seenIds.add(id);
}
if (!EMAIL_RE.test(email)) {
issues.push({ rowNumber, column: "customerEmail", value: customerEmail, code: "INVALID_EMAIL", message: "Malformed billing email" });
rowClean = false;
}
const amt = Number(amtStr);
if (!amtStr || Number.isNaN(amt) || amt <= 0 || amt > 100_000) {
issues.push({ rowNumber, column: "amountUsd", value: amountUsd, code: "AMOUNT_OUT_OF_RANGE", message: "Expected plain decimal 0.01..100000" });
rowClean = false;
}
const seats = Number(seatStr);
if (!Number.isInteger(seats) || seats < 1 || seats > 5000) {
issues.push({ rowNumber, column: "seatCount", value: seatCount, code: "INVALID_SEAT_INTEGER", message: "Expected whole integer 1..5000" });
rowClean = false;
}
if (rowClean) {
validRows.push({ rowNumber, externalId: id, customerEmail: email, amountUsd: amtStr, seatCount: seatStr });
}
}
return {
totalRows: Math.max(0, lines.length - 1),
validRows,
issues,
elapsedMs: Number((performance.now() - t0).toFixed(2)),
bytesAvoidedOnFailure: issues.length > 0 ? new TextEncoder().encode(rawCsv).byteLength : 0,
};
}

Notice that rowClean keeps checking all four columns on the same row instead of continue-ing after the first bad cell. If row 318 has both a broken email and "$1200" with a dollar sign, the user gets both errors at once rather than fixing the email, re-running, and getting yelled at a second time for the amount column.

Running npm test in the repo generates a 418.8 KB, 10,000-row CSV with four planted errors (duplicate ID at row 50, bad email at row 500, "$1200" at row 2,500, and 3.5 seats at row 7,500):

json
{
"rows": 10000,
"valid_rows": 9996,
"issues_caught": 4,
"elapsed_ms": 20.11,
"wasted_upload_avoided_kb": 418.8
}

Twenty milliseconds is barely over a single 60Hz browser frame (16.6ms), and catching those four typos upfront avoids shipping 418.8 KB over the wire on a doomed POST request.

Stashing multi-megabyte drafts in IndexedDB without extra packages

Raw IndexedDB has an ugly callback API from 2012, which scares people into installing wrappers or falling back to localStorage. In practice, if all you need is saving and restoring an upload draft by key, wrapping open, put, and get in Promises takes about 35 lines (src/storage/draftDb.ts):

typescript
const DB_NAME = "offline_sheet_guard_db";
const STORE_NAME = "draft_batches";
function openDraftDb(): Promise {
return new Promise((resolve, reject) => {
const req = indexedDB.open(DB_NAME, 1);
req.onupgradeneeded = () => {
const db = req.result;
if (!db.objectStoreNames.contains(STORE_NAME)) {
db.createObjectStore(STORE_NAME, { keyPath: "id" });
}
};
req.onsuccess = () => resolve(req.result);
req.onerror = () => reject(req.error);
});
}
export async function saveDraftSnapshot(draft: SavedDraft): Promise {
const db = await openDraftDb();
return new Promise((resolve, reject) => {
const tx = db.transaction(STORE_NAME, "readwrite");
tx.objectStore(STORE_NAME).put(draft);
tx.oncomplete = () => { db.close(); resolve(); };
tx.onerror = () => { db.close(); reject(tx.error); };
});
}

In src/App.tsx, useEffect subscribes to window's "online" and "offline" events to flip a live connectivity banner and checks loadDraftSnapshot("current") on mount. You can cut your Wi-Fi in Chrome DevTools (Network -> Offline), edit the 5,000-row sample, save a snapshot, reload the tab, and pick up right where you left off.

Three places where this simple setup isn't enough

First, client preflight checks are purely a UX and bandwidth win, not a security boundary. Keep the exact same validation rules on your backend endpoint because anyone can send malformed payloads straight to your API with curl.

Second, line.split(",") only works when none of your columns legitimately contain commas inside quotes. As soon as you add a free-text companyName column containing values like "Acme, Inc.", switch the parser step to an RFC-4180 parser such as PapaParse so quoted commas don't shift your columns right by one index.

Finally, while 10,000 rows finishes in 20 ms on the main thread, 150,000 rows takes around 300 ms, which is long enough to make typing feel sluggish if you validate on every keystroke. Above 25,000 rows, either debounce validation by 250ms or move validateInvoiceSh

2026-11-08 04:57:02 · AI应用,开源,搜索RAG,扩散模型,强化学习,招聘HR,榜单评测,开发者生态
继续滚动加载更多…