# Install Pymllm

> Install the pymllm Python package. Asks the user whether to do a full build (with CMake C++ compilation) or a fast install (Python-only, skip CMake). Use when the user asks to install, set up, or reinstall pymllm.

- Skill: `ubiquitouslearning/install-pymllm` (Agent Skill)
- Install (CLI): `npx skillmds@latest add ubiquitouslearning/install-pymllm`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ubiquitouslearning/install-pymllm/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: ubiquitouslearning (https://skillmd.com/u/ubiquitouslearning)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/ubiquitouslearning/install-pymllm

---


# Install pymllm

## Goal

Help the user install the `pymllm` package with the right configuration for their use case.

## Workflow

### Step 1: Ask the user which install mode they want

Use `AskUserQuestion` to present two options:

**Full Install (with C++ build)**
- Compiles the C++ mllm runtime and FFI extension via CMake
- Required if the user needs mobile inference, model conversion with FFI, or CPU/QNN backends
- Slower (several minutes depending on the machine)
- Command: `pip wheel -v -w dist . && pip install dist/*.whl --force-reinstall`

**Fast Install (Python-only, skip CMake)**
- Skips the entire CMake build step
- Only installs the pure Python package
- Recommended for users who only use CUDA backends (FlashInfer, TileLang) and do not need the C++ mllm runtime
- Much faster (seconds)
- Command: `SKBUILD_WHEEL_CMAKE=false pip install -e .`

### Step 2: Ask editable or non-editable

Use `AskUserQuestion` to ask:

- **Editable (`pip install -e .`)**: For active development. Python imports point to the source tree. Changes to `.py` files take effect immediately without reinstalling.
- **Non-editable (wheel)**: For stable usage. Installs a wheel into site-packages.

### Step 3: Ask whether the user needs CUDA optional dependencies

Use `AskUserQuestion` to ask whether the user needs CUDA support (FlashInfer, TileLang, pyzmq, etc.).

This determines whether to append `[cuda]` to the install specifier (e.g. `pip install -e ".[cuda]"` instead of `pip install -e .`).

**This applies to ALL install modes.** For fast-install users this is especially important since the CUDA packages are the primary compute backend.

### Step 4: Execute the install

Based on user choices, compose and run the appropriate command. The install specifier is either `.` or `".[cuda]"` depending on Step 3.

| Mode | Editable | CUDA | Command |
|------|----------|------|---------|
| Full | Yes | No  | `pip install -e -v .` |
| Full | Yes | Yes | `pip install -e -v ".[cuda]"` |
| Full | No  | No  | `pip wheel -v -w dist . && pip install dist/*.whl --force-reinstall` |
| Full | No  | Yes | `pip wheel -v -w dist . && pip install dist/*.whl --force-reinstall && pip install "pymllm[cuda]"` |
| Fast | Yes | No  | `SKBUILD_WHEEL_CMAKE=false pip install -e .` |
| Fast | Yes | Yes | `SKBUILD_WHEEL_CMAKE=false pip install -e ".[cuda]"` |
| Fast | No  | No  | `SKBUILD_WHEEL_CMAKE=false pip wheel -v -w dist . && pip install dist/*.whl --force-reinstall` |
| Fast | No  | Yes | `SKBUILD_WHEEL_CMAKE=false pip wheel -v -w dist . && pip install dist/*.whl --force-reinstall && pip install "pymllm[cuda]"` |

### Step 5: Post-install for editable + full build

If the user chose **editable + full build**, the compiled `.so` files live in a build directory (e.g. `build/bin/`), not in the source tree. The Python code at `pymllm/__init__.py` looks for libraries at `pymllm/lib/MllmFFIExtension.so`. A symlink is needed to bridge this gap.

**Invoke the `/link-pymllm-lib` skill** to help the user set up the symlink.

## Important Notes

- The project root must contain `pyproject.toml` with `scikit-build-core` as the build backend.
- The `wheel.cmake = true` flag in `pyproject.toml` controls whether CMake runs. The env var `SKBUILD_WHEEL_CMAKE=false` overrides it at install time without modifying the file.
- For non-editable full builds, the `.so` files are bundled inside the wheel automatically — no symlink needed.
- For fast installs, `pymllm.is_mobile_available()` will return `False` since no C++ libraries are present. This is expected.
- The `[cuda]` optional dependencies are defined in `pyproject.toml` under `[project.optional-dependencies]`.

