This commit is contained in:
Dan Saunders
2025-10-02 10:57:09 -04:00
parent 0250e5f87c
commit f912d1bb97
4 changed files with 39 additions and 38 deletions

View File

@@ -87,7 +87,7 @@ jobs:
uv pip install --system --no-build-isolation -e ".[dev]" --constraints torch-constraints.txt
set -o pipefail
python scripts/unsloth_install.py | bash
python scripts/cutcrossentropy_install.py --uv | bash
python scripts/cutcrossentropy_install.py | bash
- name: Make sure PyTorch version wasn't clobbered
run: |
@@ -159,10 +159,10 @@ jobs:
uv pip install --system build
python -m build --sdist
uv pip install --system dist/*.tar.gz
python scripts/unsloth_install.py | sh
python scripts/cutcrossentropy_install.py --uv | sh
printf "torch==${{ matrix.pytorch_version }}\n" > torch-constraints.txt
uv pip install --system ".[dev]" --constraints torch-constraints.txt
python scripts/unsloth_install.py | sh
python scripts/cutcrossentropy_install.py | sh
- name: Make sure PyTorch version wasn't clobbered
run: |

View File

@@ -33,20 +33,20 @@ RUN if [ "$NIGHTLY_BUILD" = "true" ] ; then \
sed -i 's#"datasets[^"]*"#"datasets @ git+https://github.com/huggingface/datasets.git@main"#' pyproject.toml; \
fi
RUN uv pip install packaging==23.2 setuptools==75.8.0
RUN uv pip install --system packaging==23.2 setuptools==75.8.0
RUN if [ "$AXOLOTL_EXTRAS" != "" ] ; then \
uv sync --frozen --extra ring-flash-attn --extra optimizers --extra ray $(printf ' --extra %s' "${AXOLOTL_EXTRAS//,/ }") $AXOLOTL_ARGS; \
else \
uv sync --frozen --extra ring-flash-attn --extra optimizers --extra ray $AXOLOTL_ARGS; \
fi
RUN uv pip install --no-build-isolation flash-attn $AXOLOTL_ARGS
RUN uv pip install --system --no-build-isolation flash-attn $AXOLOTL_ARGS
RUN python scripts/unsloth_install.py | sh
RUN python scripts/cutcrossentropy_install.py | sh
# So we can test the Docker image
RUN uv pip install -e ".[dev]"
RUN uv pip install --system -e ".[dev]"
# fix so that git fetch/pull from remote works
RUN git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*" && \

View File

@@ -1,40 +1,22 @@
"""Emit the install command for the Axolotl cut-cross-entropy fork."""
"""Print the pip command to install Axolotl's cut_cross_entropy fork."""
from __future__ import annotations
import shutil
import sys
try:
import torch
except ImportError as exc: # pragma: no cover - defensive
except ImportError as exc: # pragma: no cover
raise ImportError("Install torch via `pip install torch`") from exc
from packaging.version import Version as V
USE_UV_FLAG = "--uv" in sys.argv[1:]
USE_PIP_FLAG = "--pip" in sys.argv[1:]
if USE_UV_FLAG and USE_PIP_FLAG:
raise SystemExit("Specify only one of --uv or --pip")
if USE_PIP_FLAG:
use_uv = False
elif USE_UV_FLAG:
use_uv = True
else:
use_uv = shutil.which("uv") is not None
if V(torch.__version__) < V("2.4.0"):
if V(torch.__version__.split("+")[0]) < V("2.6.0"):
print("")
sys.exit(0)
# No need to uninstall in CI runs; the environment is fresh. Just emit the install command.
installer = "uv pip install --system" if use_uv else "pip install"
command = (
f"{installer} "
print(
"python -m pip install "
'"cut-cross-entropy[transformers] '
'@ git+https://github.com/axolotl-ai-cloud/ml-cross-entropy.git@147ea28"'
)
print(command)

37
scripts/unsloth_install.py Normal file → Executable file
View File

@@ -1,7 +1,8 @@
"""Emit the uv commands needed to install Unsloth without touching torch."""
"""Emit the install commands for Unsloth without altering torch."""
from __future__ import annotations
import shutil
import sys
from shlex import quote
@@ -14,16 +15,34 @@ from packaging.version import Version as V
MIN_TORCH = V("2.6.0")
python_version = V(torch.__version__.split("+")[0])
if python_version < MIN_TORCH:
if V(torch.__version__.split("+")[0]) < MIN_TORCH:
raise RuntimeError(
f"Torch {torch.__version__} detected, but Unsloth requires >= {MIN_TORCH}."
)
python_path = quote(sys.executable)
commands = (
f"uv pip install --python {python_path} --no-deps unsloth-zoo==2025.9.12 && "
f'uv pip install --python {python_path} --no-deps "unsloth[huggingface]==2025.9.9"'
)
USE_UV_FLAG = "--uv" in sys.argv[1:]
USE_PIP_FLAG = "--pip" in sys.argv[1:]
print(commands)
if USE_UV_FLAG and USE_PIP_FLAG:
raise SystemExit("Specify only one of --uv or --pip")
if USE_PIP_FLAG:
use_uv = False
elif USE_UV_FLAG:
use_uv = True
else:
use_uv = shutil.which("uv") is not None
python_exe = quote(sys.executable or shutil.which("python3") or "python")
if use_uv:
installer = "uv pip install --system --no-deps"
else:
installer = f"{python_exe} -m pip install --no-deps"
commands = [
f"{installer} unsloth-zoo==2025.9.12",
f'{installer} "unsloth[huggingface]==2025.9.9"',
]
print(" && ".join(commands))