v0.1 - initial commit

This commit is contained in:
Peter Knauer 2025-12-07 13:20:50 -05:00
parent 7e9ee28bdb
commit 251978cc8d
4 changed files with 197 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/.idea/

44
Dockerfile Normal file
View file

@ -0,0 +1,44 @@
# ROCm-enabled PyTorch base image from AMD
# Pick a tag that matches your installed ROCm driver best; this one is a good default.
FROM rocm/pytorch:rocm7.1.1_ubuntu22.04_py3.10_pytorch_release_2.9.1
# OCI metadata for discoverability
LABEL org.opencontainers.image.source="https://github.com/zuzupebbles/unsloth-rocm"
LABEL org.opencontainers.image.url="https://hub.docker.com/r/zuzupebbles/unsloth-rocm"
LABEL org.opencontainers.image.title="Unsloth ROCm image"
LABEL org.opencontainers.image.description="Unsloth + ROCm PyTorch for AMD GPUs (e.g. 7900 XTX)"
LABEL org.opencontainers.image.licenses="Apache-2.0"
# Basic utilities
RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install -y \
git wget curl vim nano && \
rm -rf /var/lib/apt/lists/*
# Upgrade pip and install Unsloth (AMD is supported via regular pip install)
# Unsloth itself is Apache-2.0 licensed.
RUN pip install --upgrade pip && \
pip install --no-cache-dir unsloth
# Optional: tools youll almost certainly want when experimenting
RUN pip install --no-cache-dir \
"transformers>=4.45.0" \
datasets \
accelerate \
peft \
safetensors \
bitsandbytes || true
# ^ bitsandbytes may be CUDA-only; failing here is fine, Unsloth on ROCm does not strictly need it.
# Create a non-root user that matches your host UID/GID at runtime (set via docker-compose)
ARG USERNAME=unsloth
ARG UID=1000
ARG GID=1000
RUN groupadd -g ${GID} ${USERNAME} && \
useradd -m -u ${UID} -g ${GID} -s /bin/bash ${USERNAME}
USER ${USERNAME}
WORKDIR /workspace
# Keep the container alive by default; youll exec into it
CMD ["bash"]

100
README.md
View file

@ -0,0 +1,100 @@
# unsloth-rocm 🦥🔥
Unsloth + PyTorch-on-ROCm in a ready-to-use Docker image for AMD GPUs
(Navi / RDNA2 / RDNA3 e.g. 7900 XTX).
- Base image: [`rocm/pytorch`](https://hub.docker.com/r/rocm/pytorch) (PyTorch with ROCm backend)
- Fine-tuning framework: [Unsloth](https://github.com/unslothai/unsloth) (Apache-2.0).
This repo contains:
- `Dockerfile` how the image is built
- `docker-compose.build.yml` a sample compose file for local build + dev use
The idea is to give ROCm users a “batteries-included” Unsloth container and a clean example of how to wire up devices / groups / HF cache.
---
## Requirements
On the host (e.g. Arch, Ubuntu, etc.):
- AMD GPU supported by ROCm / `rocm/pytorch` (MI* or newer Navi, see AMDs support matrix)
- ROCm stack installed and working (`rocminfo` sees your GPU)
- Docker or compatible container runtime
- User is in the appropriate groups, e.g.:
```bash
sudo usermod -aG video,docker $USER
# log out & back in afterwards
```
You should also see `/dev/kfd` and `/dev/dri` on the host:
```bash
ls /dev/kfd
ls /dev/dri
```
---
## Build locally
Clone the repo (whichever remote you like GitHub or your local Forgejo):
```bash
git clone https://github.com/zuzupebbles/unsloth-rocm.git
cd unsloth-rocm
```
Build the image:
```bash
# ensure UID/GID match your host user (especially on Arch)
export UID
export GID
docker compose -f docker-compose.build.yml build
```
This will produce a local image named:
```text
zuzupebbles/unsloth-rocm:local
```
You can confirm with:
```bash
docker images | grep unsloth-rocm
```
---
## Run for local dev
Bring up a dev container:
```bash
docker compose -f docker-compose.build.yml up -d
docker compose -f docker-compose.build.yml exec unsloth-rocm bash
```
Inside the container youll have:
* user: `unsloth`
* working dir: `/workspace`
* volumes mounted:
* `./workspace``/workspace`
* `~/.cache/huggingface``/data/hf-cache`
* `./repos-clone``/repos-clone`
Quick sanity check in the container:
```bash
python -c "import torch; print(torch.cuda.is_available(), torch.version.cuda, torch.version.hip, torch.version.git_version)"
python -c "import unsloth; print(unsloth.__version__)"
```
(ROCm builds often report HIP instead of CUDA, thats expected.)

52
docker-compose.build.yml Normal file
View file

@ -0,0 +1,52 @@
services:
unsloth-rocm:
build:
context: .
dockerfile: Dockerfile
args:
UID: ${UID:-1000}
GID: ${GID:-1000}
# Image name for local use; you can retag this for Docker Hub.
image: zuzupebbles/unsloth-rocm:local
container_name: unsloth-rocm
restart: unless-stopped
# ROCm device plumbing basically AMD's recommended set.
devices:
- /dev/kfd
- /dev/dri
group_add:
- "video" # host group that has access to /dev/kfd and /dev/dri
# - "render" # optional, if your distro uses it
cap_add:
- SYS_PTRACE
security_opt:
- seccomp=unconfined
ipc: host
shm_size: "16g"
environment:
# If you only want GPU 0, set explicitly:
- ROCM_VISIBLE_DEVICES=0
# HF cache so you don't redownload models all the time
- HF_HOME=/data/hf-cache
- HUGGINGFACE_HUB_CACHE=/data/hf-cache
- TRANSFORMERS_CACHE=/data/hf-cache
volumes:
# Workspace for notebooks / scripts
- ./workspace:/workspace
# Hugging Face cache on host
- ~/.cache/huggingface:/data/hf-cache
# Optional: local repo clones or model sources
- ./repos-clone:/repos-clone
working_dir: /workspace
stdin_open: true
tty: true