# Getting Started with Marin

In this tutorial, you will install Marin on your local machine.

## Prerequisites

Before you begin, ensure you have the following installed:

- Python 3.12 or higher
- uv (Python package manager)
- Git
- Rust toolchain via [rustup](https://rustup.rs) (only needed for source builds of Rust crates; see Rust Crates section below)
    - Recommended: `rustup toolchain install 1.91.0 && rustup default 1.91.0` (matches the Docker pin)
    - If you hit an `edition2024` error from Cargo (e.g., when building Arrow), use nightly: `rustup default nightly`
- On macOS, install additional build tools for SentencePiece: ```brew install cmake pkg-config coreutils```

In addition, you might find it useful to have the following accounts:
- [GitHub](https://github.com) for submitting pull requests
- [Weights & Biases](https://wandb.ai) for experiment tracking
- [Hugging Face](https://huggingface.co) for accessing gated models/tokenizers (such as [Meta's Llama 3.1 8B model](https://huggingface.co/meta-llama/Llama-3.1-8B))

This document focuses on basic setup and usage of Marin.
If you're on a GPU, see [Local GPU Setup](local-gpu.md) for a GPU-specific walkthrough for getting started.
Running on shared TPU/GPU capacity is handled by [Iris](https://github.com/marin-community/marin/blob/main/lib/iris/OPS.md); Marin's live TPU pool is reachable via `uv run iris --cluster=marin job run ...`.

## Installation

1. Clone the repository (~10s):
   ```bash
   git clone https://github.com/marin-community/marin.git
   cd marin
   ```

2. Create and activate a virtual environment (~0s):
   ```bash
   uv venv --python 3.12
   source .venv/bin/activate  # On Windows: .venv\Scripts\activate
   ```

3. Install the package and dependencies (5-10m, mostly building packages from source):

    Use `uv sync` to install dependencies and the local Marin package (editable) in one step:
   ```bash
   # Resolve and install dependencies + local package (editable)
   uv sync --all-packages
   ```

4. Setup [Weights and Biases (WandB)](https://wandb.ai) so you can monitor your runs:
   ```bash
   export WANDB_API_KEY=...  # Get this from https://wandb.ai/authorize
   ```
You can also set `WANDB_ENTITY` and `WANDB_PROJECT`.

5. Setup the Hugging Face CLI so you can use gated models/tokenizers (such as [Meta's Llama 3.1 8B model](https://huggingface.co/meta-llama/Llama-3.1-8B)):
   ```bash
   export HF_TOKEN=...  # Get this from https://huggingface.co/settings/tokens
   ```

6. Define the path to where all artifacts generated during execution will be stored (e.g., `local_store`):

    ```bash
    export MARIN_PREFIX=...
    ```
For example, training checkpoints usually will be written to
`${MARIN_PREFIX}/checkpoints/`. You can set this to an fsspec-recognizable path
(e.g., a GCS bucket) or a directory on your machine. See [Understanding
`MARIN_PREFIX` and `--prefix`](../explanations/marin-prefix.md) for details.

You might find it convenient to store `WANDB_API_KEY` and `HF_TOKEN` and
`MARIN_PREFIX` in an `.env` file, which you can load in one go with `source
.env`.

## Hardware-specific Setup

Marin runs on multiple types of hardware (CPU, GPU, TPU).

!!! info "Install `marin` for different accelerators"

    Marin requires different JAX installations depending on your hardware accelerator. These installation options are defined in our `pyproject.toml` file and will install the appropriate JAX version for your hardware.

    === "CPU"
        ```bash
        # Install CPU-specific dependencies (local package included)
        uv sync --all-packages --extra=cpu
        ```

    === "GPU"
         If you are working on GPUs you'll need to set up your system first by installing the appropriate CUDA version. In Marin, we default to 12.9.0:
         ```bash
         wget https://developer.download.nvidia.com/compute/cuda/12.9.0/local_installers/cuda_12.9.0_575.51.03_linux.run
         sudo sh cuda_12.9.0_575.51.03_linux.run
         ```
         Now we'll need to install cuDNN, instructions from [NVIDIA docs](https://developer.nvidia.com/cudnn-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=24.04&target_type=deb_local), via following:
         ```bash
         wget https://developer.download.nvidia.com/compute/cudnn/9.10.0/local_installers/cudnn-local-repo-ubuntu2404-9.10.0_1.0-1_amd64.deb
         sudo dpkg -i cudnn-local-repo-ubuntu2404-9.10.0_1.0-1_amd64.deb
         sudo cp /var/cudnn-local-repo-ubuntu2404-9.10.0/cudnn-*-keyring.gpg /usr/share/keyrings/
         sudo apt-get update
         sudo apt-get -y install cudnn
         sudo apt-get -y install cudnn-cuda-12
         ```
         Once system is setup you can verify it via:
         ```bash
         nvcc --version
         ```
         Finally install Python deps for GPU setup:

         ```bash
         # Install GPU-specific dependencies (local package included)
         uv sync --all-packages --extra=gpu
         ```

    === "TPU"

        ```bash
        # Install TPU-specific dependencies
        uv sync --all-packages --extra=tpu
        ```

## Rust Crates (dupekit)

Marin includes Rust-backed packages (`marin-dupekit-native`,
`marin-finelog-server`) that are installed as **pre-built wheels** by default —
no Rust toolchain needed. `uv sync` fetches the wheels from PyPI automatically.

To switch to **source builds** (requires Cargo), use the Makefile targets:

```bash
# Check current mode and Cargo availability
make rust-status

# Switch to dev mode: modifies pyproject.toml to build from source (requires Cargo)
make rust-dev

# Switch back to user mode: reverts pyproject.toml to pre-built wheels (no Cargo needed)
make rust-user
```

!!! warning
    `make rust-dev` adds local path sources for the native packages to the root
    `pyproject.toml` and to `lib/dupekit/pyproject.toml` / `lib/finelog/pyproject.toml`.
    **Do not commit those files while in dev mode** — CI will reject them.
    Run `make rust-user` before committing.

## Trying it Out

To check that your installation worked, you can go to the [First Experiment](first-experiment.md) tutorial, where
you train a tiny language model on TinyStories on your CPU.  For a sneak preview, simply run:

```bash
wandb offline  # Disable WandB logging
uv run python experiments/tutorials/train_tiny_model.py --device cpu --dataset tinystories
```

This will:

1. Download and tokenize the TinyStories dataset to `${MARIN_PREFIX}/`
2. Train a tiny language model
3. Save the model checkpoint to `${MARIN_PREFIX}/`

## Next Steps

Now that you have Marin set up and running, you can either continue with the
next hands-on tutorial or read more about how Marin is designed for building
language models.

1. Follow our [First Experiment](first-experiment.md) tutorial to run a training experiment.
2. Read our [Language Modeling Pipeline](../explanations/lm-pipeline.md) to understand Marin's approach to language models.
3. Read [Lazy artifacts](../explanations/lazy-artifacts.md) to understand Marin's execution model.
