Nanny7's picture
feat: initial commit for B Map AI backend and Gemma LLM service
2f86d9b
|
Raw History Blame Contribute Delete
6.15 kB
# Hackable Diffusion Adapter
This package contains the adapter library for fine-tuning using the
Hackable Diffusion library.
## Setup Instructions
### 1. Python Environment
We recommend Python 3.12 and CUDA 13 for this project.
### 2. Installation
First install the gemma package.
**From PyPI (Recommended)**
```bash
pip install gemma
```
**From Source**
```bash
git clone https://github.com/google-deepmind/gemma.git
cd gemma
pip install .
```
Then we additionally require `jax[cuda13]` dependencies that can be installed
via
```bash
pip install -U jax[cuda13]
```
> [!Note]
> We have tested the library with CUDA 13, other versions can cause
> NCCL errors. Don't mix in other CUDA 12 packages such as
> `jax-cuda12-plugin` or `nvidia-nccl-cu12`.
### 3. Data Preparation
Before training, you need to download and prepare the datasets.
Note that running these scripts requires first cloning the source repository.
#### PubMedQA
To prepare the PubMedQA dataset, make sure your Python environment is
activated, then run:
```bash
cd gemma/diffusion/hackable_diffusion_adapter/data/pubmedqa
bash prepare_pubmedqa_dataset.sh
```
#### Sudoku
To prepare the Sudoku dataset, you first need to configure your Kaggle API
credentials:
- Generate your Kaggle access token.
- Set up the token on your machine:
```bash
mkdir -p ~/.kaggle && echo YOUR_KAGGLE_TOKEN > ~/.kaggle/access_token && chmod 600 ~/.kaggle/access_token
```
- Make sure your Python environment is activated, then run the preparation
script:
```bash
cd gemma/diffusion/hackable_diffusion_adapter/data/sudoku
bash prepare_sudoku_dataset.sh
```
### 4. Training
Once your environment is set up and the data is downloaded, you can kick off a
minimal training run with the following commands.
Command line overrides are used to prevent compilation hangs and NCCL errors.
#### PubMedQA
We fine-tune the model with rank 4 LoRA, using 2 canvases of size 128 each.
We use batch size 2, peak learning rate 1e-4 and train for 2000 steps.
We recommend using a machine with compute capacity at least that of 2 A100s.
From the parent dir of the gemma directory.
```bash
env XLA_FLAGS="--xla_disable_hlo_passes=constant_folding" \
NCCL_ALGO="Ring" \
NCCL_PROTO="LL128" \
NCCL_NVLS_ENABLE="0" \
NCCL_CUMEM_ENABLE="0" \
python3 -m kauldron.main \
--cfg=gemma/diffusion/hackable_diffusion_adapter/configs/sft_pubmedqa.py \
--cfg.workdir=$(pwd)/xp_dir
```
#### Sudoku (with LoRA)
We fine-tune the model with rank 8 LoRA, using 1 canvas of size 256.
We use batch size 8, peak learning rate 1.5e-4 and train for 2000 steps.
We recommend using a machine with compute capacity at least that of 2 A100s.
From the parent dir of the gemma directory.
```bash
env XLA_FLAGS="--xla_disable_hlo_passes=constant_folding" \
NCCL_ALGO="Ring" \
NCCL_PROTO="LL128" \
NCCL_NVLS_ENABLE="0" \
NCCL_CUMEM_ENABLE="0" \
python3 -m kauldron.main \
--cfg=gemma/diffusion/hackable_diffusion_adapter/configs/sft_sudoku.py \
--cfg.workdir=$(pwd)/xp_dir
```
#### Sudoku (full weight updates)
We fine-tune the model using full weight updates with 1 canvas of size 256.
We use batch size 8, peak learning rate 1.5e-4 and train for 2000 steps.
We also use Adafactor for optimization to reduce memory usage.
We recommend using a machine with compute capacity at least that of 8 A100s.
From the parent dir of the gemma directory.
```bash
env XLA_FLAGS="--xla_disable_hlo_passes=constant_folding" \
NCCL_ALGO="Ring" \
NCCL_PROTO="LL128" \
NCCL_NVLS_ENABLE="0" \
NCCL_CUMEM_ENABLE="0" \
python3 -m kauldron.main \
--cfg=gemma/diffusion/hackable_diffusion_adapter/configs/sft_sudoku_full.py \
--cfg.workdir=$(pwd)/xp_dir
```
### 5. Evaluation
Evaluation is run **offline** as a separate step after training. It loads a
saved checkpoint, runs autoregressive (AR) sampling on the eval dataset, and
reports task-specific metrics (e.g., accuracy for Sudoku, BLEU for PubMedQA).
From the parent dir of the gemma directory:
```bash
env XLA_FLAGS="--xla_disable_hlo_passes=constant_folding" \
XLA_PYTHON_CLIENT_PREALLOCATE="false" \
TF_FORCE_GPU_ALLOW_GROWTH="true" \
python3 -m gemma.diffusion.hackable_diffusion_adapter.eval_main \
--cfg=gemma/diffusion/hackable_diffusion_adapter/configs/sft_sudoku.py \
--task=sudoku \
--step=1000 \
--eval_names=sample_ar_steps64 \
--cfg.workdir=$(pwd)/xp_dir_sudoku_lora \
--cfg.eval_ds.batch_size=2 \
--cfg.aux.eval_num_batches=2 \
--cfg.aux.num_canvases=2
```
#### Key Flags
| Flag | Description |
|---|---|
| `--cfg` | Path to the training config file (same one used for training). |
| `--task` | Task to evaluate: `sudoku` or `pubmedqa`. Determines which metrics are reported. |
| `--step` | Checkpoint step to evaluate. If omitted, the latest checkpoint is used. |
| `--eval_names` | Comma-separated list of evaluators to run (e.g. `sample_ar_steps64`). If omitted, all evaluators are run. |
| `--cfg.workdir` | Working directory that contains the training checkpoints. |
| `--cfg.eval_ds.batch_size` | Eval batch size (reduce if running out of memory). |
| `--cfg.aux.eval_num_batches` | Number of eval batches to process. Set to a small value for quick sanity checks, or omit to run over the full eval set. |
| `--cfg.aux.num_canvases` | Number of AR canvases to generate per example. |
#### Available Evaluators
The evaluators are generated automatically from the config. The naming
convention is:
- `sample_ar_steps{N}` — AR diffusion sampling with `N` denoising steps
- `sample_ar_steps{N}_early_stopping` — Same as above, but with
entropy-based early stopping.
#### Checking Eval Results
Eval metrics are written to TensorBoard event files in the working directory.
To view the results, launch TensorBoard pointing at the workdir:
```bash
tensorboard --logdir=$(pwd)/xp_dir_sudoku_lora
```
Metrics for each evaluator appear under the corresponding eval name
(e.g. `sample_ar_steps64`). For Sudoku, key metrics include overall accuracy,
cell accuracy and difficulty-stratified results. For PubMedQA, look for
accuracy and BLEU scores.