NDA banned cloud models, so I ran it locally
An NDA on a recent deal barred sending the target's data to cloud AI. I still wanted AI on the data room, about 125 documents and 4,000 pages, so I ran the whole thing on one NVIDIA DGX Spark at home. Here is what it took, what broke, and what I'd tell another searcher in the same spot.
The box
The Spark is a small desktop machine with 128 GB of unified memory (121 GB usable), a 3.7 TB drive, and an idle draw near 30 watts. I set it up in April for general lab work and paid just under $5k for it, but the price for them has increased since then. Although I use it for local agentic work and models I run in custom harnesses, this deal was the first research job that needed it.
Its advantage is memory, not speed. My RTX 4090 machine generates text about 3.8 times faster on a mid-size model, but its 24 GB can't hold anything big. The Spark holds a 120-billion-parameter model at 5-bit precision, or a 284-billion-parameter model squeezed to 2-bit with a one-million-token window. That second model ran at about 20 tokens per second, roughly 15 words a second. Reading a long prompt is slower, about 350 tokens a second, so a 130,000-token prompt sits silent for six minutes before the first word appears. My agent tool read that silence as a dead connection and retried, which threw the work away. So let's just say your timeouts have to be incredibly long.
Keeping the data local
"Be careful" is not a control, so I built the boundary into the setup:
The pipeline code has no cloud AI client. It also refuses to start unless the model endpoint resolves to a private address.
The API key is set to a deliberately invalid value. Leave it unset and the tool inherits your real key, so a leak succeeds. With a bad key, a leak fails with an error.
Tool access defaults to deny. My first attempt, a rule blocking web fetch, blocked nothing. The model reached the web with curl anyway, and the real hole was 40-plus connectors (Drive, Gmail) I'd forgotten were attached. Test that your deny rule denies.
The orchestrator never prints model output, and a test fails if anyone adds a preview field.
Prose written about the documents is still the documents. Status files and working notes that quote figures count.
Thankfully I didn't put a single file in this pipeline from the data room until I was sure these edge cases and unknowns were captured and resolved.
Choosing the model
I picked my first roster off leaderboard rankings, and it failed. The top-ranked giants had to be crushed to 3-bit precision to fit. One scored 1 out of 5 on deal arithmetic: it applied a multiple to the wrong year's earnings and produced a 19% error in confident formatting, the same way on two runs. Another ran for eight hours and never returned an answer.
The winner was a 120B model at 5-bit. It scored 100% on a 50-item synthetic test covering numbers, long-context recall, citations, and tables. But as I said, the test harness turned out to be more valuable than the model list.
For the memo work I later moved to the 2-bit 284B model for its million-token window. That is below the precision floor my own eval set for numbers. So the model transcribes and cites figures, and a script checks each cited cell against the source. It doesn't compute returns.
What broke in the documents
Excel printed to PDF. 40 of the roughly 125 files were PDF printouts of workbooks that also came as Excel files. Reading all 40 workbooks natively (about 85,000 rows) took under 100 seconds. One PDF page from those printouts hadn't finished after 10 minutes. I route each page by what it contains and skip the PDF when the native file exists.
Small vision models fabricate. Two 12B models returned well-formed tables with correct titles and headers and every digit invented. They scored 17% and 6%. Well-formed output tells you nothing about accuracy.
A second watermark scrub. I added it as belt and suspenders. It deleted 7,968 real dates and deadlines across 2,025 pages. The first scrub was correct, and the second could only ever remove real text.
What broke in the judgment
Leading prompts. I asked two unrelated models to "identify the diligence red flags" on a deliberately clean synthetic company. Each manufactured three to five. One explained that "consistency and a lack of noise are often red flags in themselves." Neutral wording gave a correct all-clear. Now I ask for a verdict, require a quoted figure for each concern, and say that "clean" is an acceptable answer.
The wrong scenario. The deal model workbook held three cases sharing about 190 identical line items, so a text search returns all three. A wrong pick would have quoted the seller's bull case as fact, sourced and cited. I stamped the scenario name on every extracted line and added a check that counts unlabeled citations.
What it can't do
- Interactive work. Cloud models felt 5 to 6 times faster to work with. Local is for batch and overnight jobs.
- Setup effort. I found at least six ways the pipeline could fail silently, in scoring, routing, and gateway settings. Most were in the plumbing, not the model.
- Finished memos. The first draft I read was accurate and obviously AI-written. I stopped the drafting run on its fifth improvement pass.
- Cost proof. I never priced the local run against cloud API costs. The marginal cost was electricity, so I can't tell you it was cheaper. I really have no idea.
One caveat on the boundary. The rule I worked to was that no file contents go to a cloud model. A local model also wrote public web search queries from gaps in the documents, and a search engine ran them. I decided that was fine. Read your NDA's wording before you make that call. I used serper.dev which is a pretty good API
What I'd tell another searcher
Memory matters more than speed for this job.
Build a small test set with known answers before you trust any model with a data room: a synthetic company with planted defects, plus a clean one as a control.
Enforce the boundary in code, then test that the guard blocks.
Ask for verdicts with quoted evidence, and let "nothing here" be an answer.
Local fits overnight work over big document sets. It doesn't fit chat.
Hope this is helpful to others!