Vlm Ocr Alice logo

Vlm Ocr Alice

Community
scdenney
vlm-ocr-alice

Runs the GPU part of a vlm-ocr pipeline on Leiden University's ALICE cluster. Decides whether a corpus needs ALICE, picks a GPU partition for the model, sets up storage, a pinned vLLM environment and offline weights, ships code and scans, runs a gate job and chained bulk jobs with the bundled SLURM template, and brings the page records home for post-processing. Use with vlm-ocr when OCRing scans on ALICE or deciding whether to.

Overview

Publisherscdenney
Repositoryopen-science-skills
Skill namevlm-ocr-alice
Stars
69
Forks
3
Bundled files
1
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 1 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by scdenney on GitHub. Read the source before you install it.

Installation

Install the Vlm Ocr Alice AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/scdenney/open-science-skills/tree/main/plugin/skills/vlm-ocr-alice
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/scdenney/open-science-skills.git /tmp/open-science-skills
mkdir -p .claude/skills
cp -r /tmp/open-science-skills/plugin/skills/vlm-ocr-alice .claude/skills/vlm-ocr-alice
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Vlm Ocr Alice in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Vlm Ocr Alice on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Vlm Ocr Alice is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

VLM-OCR on ALICE

Instructions

This skill pairs with vlm-ocr, which holds the method: triage, evaluate, run, clean. This skill covers where and how the GPU work runs on ALICE, Leiden University's SLURM cluster, and the failure modes met in a production run there (October 2026: about 36,600 pages of Korean textbooks with Qwen3.6-35B-A3B-FP8 on vLLM 0.19). Partition names, limits and paths below were checked on 17 Oct 2026; confirm them live before submitting (sinfo -s), and use the ALICE wiki and helpdesk (helpdesk@alice.leidenuniv.nl) for anything account-related.

The bundled scripts/serve_and_ocr.slurm starts vLLM on the job's GPUs, runs vlm-ocr's scripts/ocr_client.py over a manifest, and stops vLLM. Copy both into the deployment's code/ directory.

1. Decide whether the corpus needs ALICE

  • Measure first. vlm-ocr triage §3 gives pages per hour for the shortlisted models on the machine you have. Divide the corpus page count by it and add about 30 % for retries.
  • Go to ALICE when the run would take more than a night on local hardware, or the model that won the comparison does not fit in local memory. A 35B mixture-of-experts model in FP8 needs about 35 GB for weights plus the KV cache; a 24 GB laptop runs 4–8B models only, one page at a time.
  • Stay local for triage, contact sheets, pilot reads with small models, and all post-processing. These are CPU or small-GPU work.
  • Data: ALICE is university infrastructure, so scans that may not go to a commercial API can usually go there. Personal data still needs to fit your data management plan; ask the data steward when unsure.

2. Pick the partition for the model

Model footprintPartition and GRESMeasured or expected
Up to ~8B parameters (small VLMs, OCR specialists, second readers)gpu-l4-24g --gres=gpu:l4:1, or an A100 slice on gpu-mig-40g --gres=gpu:4g.40gb:1A 3B second reader (dots.mocr) read the 48 gate sample pages on one MIG slice
30–35B MoE in FP8 (fits one 48 GB GPU)LUCDH members: --account=gpu_lucdh --partition=gpu_lucdh --gres=gpu:a40:2, one server per GPU. Others: gpu-a100-80g --gres=gpu:a100:12,000–2,700 dense pages/h per A40; 4,300 (dense 1950s print) to 7,500 (sparse elementary pages) pages/h on one A100
Larger than one GPUgpu-a100-80g with several GPUs and tensor parallelism (TP= in the template)Public and scarce; ask before planning on it
Tests under 4 hgpu-short --gres=gpu:1Startup and smoke tests

Time limits: 7 days on the public GPU partitions, 14 days on gpu_lucdh, 4 hours on gpu-short. gpu_lucdh (two A40s on one node) is restricted to its groups; the public partitions are open to every account. When the preferred partition is busy, split the manifest: in the 2026 run, the main books ran on gpu_lucdh while the elementary books ran on a public A100 at the same time.

3. Set up storage, environment and weights once

  • Keep the deployment on group or project storage, not in $HOME: ROOT/{code,pdfs,output,logs}. On ALICE that is /zfsstore/user/$USER where your group has it, or your group's directory on /data1 (shared BeeGFS, 81 % full in October 2026). Check quota -s and df -h before copying gigabytes of scans.
  • Download weights once, in a CPU job, into a shared cache, at a pinned revision (HF_HOME on the same storage; hf download <model id> --revision <commit> in a cpu-short job). Serve the same revision (MODEL_REVISION=<commit> in the template) and record it; an offline run otherwise loads whatever the shared cache holds. Run every GPU job offline (HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1; the template sets them), so a missing file fails at once instead of downloading on a compute node.
  • Build the vLLM virtualenv once, in a job, with pinned versions, and never install into it again. In the production run, reinstalling into a working environment broke its torch build. Record the versions in the job log (the template prints them). The 2026 run used vLLM 0.19.0 with torch 2.10.0.
  • A newer model can need a second environment; build it beside the pinned one. Gemma 4 needs transformers 5, which vLLM 0.19 excludes, so the 2026 Polish run built vLLM 0.31.0 separately. Its wheels are CUDA 13 builds: with uv 0.8 name the index (--extra-index-url https://download.pytorch.org/whl/cu130 --index-strategy unsafe-best-match), because --torch-backend=auto on a gpu-short node picked CUDA 12.6 for an RTX 2080 Ti and the import failed. The node drivers (580–610) support CUDA 13. Install pymupdf into any environment the client runs in; the template runs the client with the server's Python.
  • Prefer the model publisher's FP8 or AWQ/GPTQ weights. FP8 ran on the A40s and A100s through vLLM's weight-only kernels. bitsandbytes 4-bit failed on the MoE model.

4. Ship code and scans

  • Build the manifest locally from triage.csv: doc_id,path[,pages,dpi], with the most important documents first (benchmark pairs, then in-scope books), so a job that dies has finished them.
  • Stage scans under ASCII file names (symlinks are enough) and keep the original names in the manifest. Catalogue names with commas, spaces and parentheses break shell and SLURM quoting.
  • Record the code version: git rev-parse HEAD > code/GIT_COMMIT. The template prints it into every job log.
  • Copy both directories in one transfer: rsync -avL code pdfs <login node>:ROOT/ (no trailing slashes, so code/ and pdfs/ arrive as directories; -L copies symlink targets).

5. Run the gate, then chained bulk jobs

  • Submit the gate (vlm-ocr evaluate §6) as its own job: sbatch --export=ALL,MODEL=...,MANIFEST=manifest_gate.csv,RUN=gate serve_and_ocr.slurm. For a prompt × dpi grid, submit one job per combination, or loop over combinations in one job so the server loads once.
  • Queue the bulk jobs on hold, and release them only after the gate is scored. afterok only means the gate job finished; it knows nothing about CER thresholds or spelling counts. Submit bulk jobs with --hold and the settings the gate is expected to confirm, score the gate (vlm-ocr evaluate §6), then scontrol release <job id>, or scancel if it failed. In 2026 the bulk jobs were queued behind the final gate and would have been cancelled had it failed; two were later moved to a free public A100 so they ran in parallel with the first.
  • Resubmit the same command after a crash or a timeout. Page-level resume skips finished pages made with the same model, prompt, dpi and decoding settings. The job exits 1 while pages are missing, failed or refused (resubmit), and 2 when only looping, truncated or empty pages remain (review them).

6. Watch without loading the login node

  • Let SLURM email you (--mail-type=END,FAIL in the template; fill in --mail-user). If you must look, run squeue -u $USER and sacct -j <id> in one SSH call, at most once a minute. Never loop watch against a login node.
  • Run nothing heavy on a login node: no Python over the corpus, no model downloads, no post-processing. ALICE's rules require SLURM for compute.
  • If a login node hangs after authentication, use the other one (login3 and login4 share home directories and the scheduler).
  • Read the job log for: server ready time, the nvidia-smi memory line, pages-per-second lines, the retry-pass count, and the client's final completeness line and exit code.

7. Bring the records home

  • rsync output/<run>/ back and post-process locally or in a cpu-short job (vlm-ocr clean). Post-processing is CPU work and is re-run whenever a rule changes, so it belongs where you iterate.
  • Keep the per-page JSONL on ALICE and locally; it is the raw layer every later fix is rebuilt from.
  • Leave nothing running: squeue -u $USER is empty, and no sleep infinity or interactive jobs are holding GPUs.

Gotchas from the production run

  • Two vLLM jobs on one node collide on port 8000. The template asks the operating system for free ports and checks that its own server answers.
  • A compile-cache path left by another user's job raises PermissionError. The template puts vLLM, Triton and Inductor caches in the job's $TMPDIR.
  • On a MIG node, nvidia-smi lists every physical GPU, not the job's slice. The template counts CUDA_VISIBLE_DEVICES instead.
  • Loading a 35B model from network storage took about 8 minutes. The template waits up to 20 minutes for the health check and prints the server log tail if the server dies.
  • Temperature 0 is not bit-identical across batch compositions in vLLM. Twin scores from the bulk run differed from the gate by up to 0.12 pp raw, within 0.1 pp after cleaning. Treat a larger gap as a pipeline change.
  • vLLM 0.2x and later compile FlashInfer's sampling kernels at start-up, which needs nvcc. ALICE's CUDA modules stop at 12.9 and a CUDA 13 environment ships no compiler, so the server died during warm-up ("Could not find nvcc"). Greedy decoding does not need that sampler: export VLLM_USE_FLASHINFER_SAMPLER=0.
  • The client exits 2 when only review pages remain (loops, truncations, empty pages), and SLURM then reports the job as FAILED. Read the client's last "Done:" line before resubmitting.
  • The public A100 partition runs at most two GPUs per user at a time (QOSMaxGRESPerUser as the pending reason). Plan shards around it. In 2026 the last shard was split three ways, two parts on A100s and one on the A40s, so no part started late and ran alone for hours.
  • Move a slow retry pass to an A100. The retry pass holds only looping pages, and each runs to the token limit. On the A40s, 63 retry pages for a dense 31B model ran for over an hour with one of the two GPUs idle. Cancelling after the first pass and resubmitting the same manifest on an A100 skipped the finished pages and ran the retries in 13 minutes, model load included. Cancelling is safe because the client appends a record only when a page completes; check afterwards that every JSONL line parses.
  • Online FP8 lets a dense 30B model use the A40s. Gemma 4 31B in vLLM's --quantization fp8 matched BF16 on the Polish gate and read about 430 dense pages an hour per A40 (16 in flight) and about 1,700 on an A100 (32 in flight) on the gate; over the 48,390-page bulk run it averaged about 1,500 pages an hour on an A100 and 800 on the two-A40 node; in BF16 it fills an 80 GB A100 and cannot run on an A40.
  • Some OCR specialists need extra server flags, for example --trust-remote-code and a string chat-template content format for dots.mocr, and the image before the prompt (CLIENT_ARGS="--image-first --retry-penalty 0"). Put arguments that carry JSON, such as an image-token budget, one per line in a file passed as VLLM_ARGS_FILE. Check the model card's vLLM section and license.

Quality Checks

  • Need for ALICE decided from corpus pages ÷ measured pages per hour, not assumed
  • Partition matches the model's memory footprint; gpu-a100-80g used only when smaller GPUs cannot hold the model or the preferred partition is busy
  • Deployment on group storage with quota checked; weights downloaded in a CPU job at a pinned revision and served at that revision; GPU jobs run offline
  • vLLM environment built once with pinned versions and not modified afterwards; versions and GIT_COMMIT printed in every job log
  • Scans staged under ASCII names with a manifest ordered by priority
  • Gate job run and scored first; bulk jobs held (--hold) and released only after the gate passed
  • Monitoring by SLURM email; no polling loops or compute on a login node
  • Client's completeness line checked (records = pages, zero errors) and the twins re-scored against the gate
  • Page records copied home and kept; post-processing run off the login node; no jobs left in the queue

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Vlm Ocr Alice AI skill do?

Runs the GPU part of a vlm-ocr pipeline on Leiden University's ALICE cluster. Decides whether a corpus needs ALICE, picks a GPU partition for the model, sets up storage, a pinned vLLM environment and offline weights, ships code and scans, runs a gate job and chained bulk jobs with the bundled SLURM template, and brings the page records home for post-processing. Use with vlm-ocr when OCRing scans on ALICE or deciding whether to.

Why use Vlm Ocr Alice on TypingMind?

Because you install it once and use it with any model. Vlm Ocr Alice is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Vlm Ocr Alice in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/scdenney/open-science-skills/tree/main/plugin/skills/vlm-ocr-alice. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Vlm Ocr Alice?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Vlm Ocr Alice?

As many as you like. As long as a model supports skills, you can use Vlm Ocr Alice with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Vlm Ocr Alice AI skill free?

It is published on GitHub by scdenney. Check the repository for licensing terms. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇