mirror of
https://git.datalinker.icu/comfyanonymous/ComfyUI
synced 2026-09-08 18:17:04 +08:00
Add UV package manager support and installation instructions
This commit is contained in:
parent
d9a87c1e6a
commit
6e58131add
26
.github/workflows/uv-build.yml
vendored
Normal file
26
.github/workflows/uv-build.yml
vendored
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
name: Build and Test
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ main ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ main ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Set up Python
|
||||||
|
uses: actions/setup-python@v4
|
||||||
|
with:
|
||||||
|
python-version: '3.10'
|
||||||
|
- name: Install uv
|
||||||
|
run: |
|
||||||
|
curl -LsSf https://astral.sh/uv/install.sh | sh
|
||||||
|
echo "$HOME/.local/bin" >> $GITHUB_PATH
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
uv pip install -r requirements.txt
|
||||||
|
uv pip install -r requirements_advanced.txt
|
||||||
|
# Additional steps...
|
||||||
@ -35,6 +35,44 @@ If you cannot find an existing issue that describes your bug or feature, create
|
|||||||
|
|
||||||
* Please refer to the article on [creating pull requests](https://github.com/comfyanonymous/ComfyUI/wiki/How-to-Contribute-Code) and contributing to this project.
|
* Please refer to the article on [creating pull requests](https://github.com/comfyanonymous/ComfyUI/wiki/How-to-Contribute-Code) and contributing to this project.
|
||||||
|
|
||||||
|
## Development Environment Setup
|
||||||
|
|
||||||
|
### Setting Up with UV (Recommended)
|
||||||
|
|
||||||
|
*Added 2025-05-02 by kairin*
|
||||||
|
|
||||||
|
We recommend using [UV](https://github.com/astral-sh/uv) for faster, more reliable package management:
|
||||||
|
|
||||||
|
1. **Install UV**:
|
||||||
|
```bash
|
||||||
|
curl -LsSf https://astral.sh/uv/install.sh | sh
|
||||||
|
source $HOME/.local/bin/env # For bash/zsh
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Set up development environment**:
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/comfyanonymous/ComfyUI.git
|
||||||
|
cd ComfyUI
|
||||||
|
|
||||||
|
# Create virtual environment
|
||||||
|
uv venv
|
||||||
|
source .venv/bin/activate # Linux/macOS
|
||||||
|
# or
|
||||||
|
.venv\Scripts\activate # Windows
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
|
uv pip install -r requirements.txt
|
||||||
|
|
||||||
|
# Install development dependencies
|
||||||
|
uv add --dev pytest black isort
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Install in development mode**:
|
||||||
|
```bash
|
||||||
|
uv pip install -e .
|
||||||
|
```
|
||||||
|
|
||||||
|
### Working with Dependencies
|
||||||
|
|
||||||
## Thank You
|
## Thank You
|
||||||
|
|
||||||
|
|||||||
29
README.md
29
README.md
@ -192,6 +192,35 @@ Put your SD checkpoints (the huge ckpt/safetensors files) in: models/checkpoints
|
|||||||
|
|
||||||
Put your VAE in: models/vae
|
Put your VAE in: models/vae
|
||||||
|
|
||||||
|
## Installation Options
|
||||||
|
|
||||||
|
### Option 1: Install with UV (Recommended)
|
||||||
|
|
||||||
|
*Added 2025-05-02*
|
||||||
|
|
||||||
|
[UV](https://github.com/astral-sh/uv) is a faster, more reliable Python package installer that we now recommend for ComfyUI.
|
||||||
|
|
||||||
|
1. **Install UV**:
|
||||||
|
```bash
|
||||||
|
curl -LsSf https://astral.sh/uv/install.sh | sh
|
||||||
|
source $HOME/.local/bin/env # For bash/zsh
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Install ComfyUI dependencies**:
|
||||||
|
```bash
|
||||||
|
# Create and activate virtual environment
|
||||||
|
uv venv
|
||||||
|
source .venv/bin/activate # Linux/macOS
|
||||||
|
# or
|
||||||
|
.venv\Scripts\activate # Windows
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
|
uv pip install -r requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
For detailed instructions on using UV with ComfyUI, see our [UV Migration Guide](UV_MIGRATION.md).
|
||||||
|
|
||||||
|
### Option 2: Install with pip (Traditional)
|
||||||
|
|
||||||
### AMD GPUs (Linux only)
|
### AMD GPUs (Linux only)
|
||||||
AMD users can install rocm and pytorch with pip if you don't have it already installed, this is the command to install the stable version:
|
AMD users can install rocm and pytorch with pip if you don't have it already installed, this is the command to install the stable version:
|
||||||
|
|||||||
83
UV_MIGRATION.md
Normal file
83
UV_MIGRATION.md
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
# ComfyUI Migration to UV Package Manager
|
||||||
|
|
||||||
|
## What is UV?
|
||||||
|
|
||||||
|
[UV](https://github.com/astral-sh/uv) is a modern Python package installer and resolver written in Rust. It serves as a drop-in replacement for pip with significant performance improvements:
|
||||||
|
|
||||||
|
- **Speed**: UV installs packages 10-100x faster than pip
|
||||||
|
- **Reliability**: Better dependency resolution to avoid conflicts
|
||||||
|
- **Compatibility**: Works with existing requirements.txt files
|
||||||
|
- **Modern**: Built with Rust for performance and safety
|
||||||
|
|
||||||
|
## Why Migrate from pip to UV?
|
||||||
|
|
||||||
|
- Faster installation of dependencies
|
||||||
|
- Improved virtual environment management
|
||||||
|
- Better handling of dependency conflicts
|
||||||
|
- Consistent installation experience across platforms
|
||||||
|
- Compatibility with existing pip workflows
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Install UV:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Install UV
|
||||||
|
curl -LsSf https://astral.sh/uv/install.sh | sh
|
||||||
|
|
||||||
|
# Add to PATH (bash/zsh)
|
||||||
|
source $HOME/.local/bin/env
|
||||||
|
|
||||||
|
# Or for fish shell
|
||||||
|
# source $HOME/.local/bin/env.fish
|
||||||
|
```
|
||||||
|
|
||||||
|
## Using UV with ComfyUI
|
||||||
|
|
||||||
|
### Basic Usage
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create a virtual environment
|
||||||
|
uv venv
|
||||||
|
source .venv/bin/activate # On Linux/macOS
|
||||||
|
# .venv\Scripts\activate # On Windows
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
|
uv pip install -r requirements.txt
|
||||||
|
|
||||||
|
# Install advanced dependencies (if needed)
|
||||||
|
uv pip install -r requirements_advanced.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
### UV Native Commands
|
||||||
|
|
||||||
|
Instead of using the pip-compatible interface, you can use UV's native commands:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Install packages
|
||||||
|
uv add packagename
|
||||||
|
|
||||||
|
# Install dev dependencies
|
||||||
|
uv add --dev pytest black
|
||||||
|
|
||||||
|
# View dependency tree
|
||||||
|
uv tree
|
||||||
|
|
||||||
|
# Update dependencies
|
||||||
|
uv sync
|
||||||
|
```
|
||||||
|
|
||||||
|
## Migration Tips
|
||||||
|
|
||||||
|
1. UV is designed to be a drop-in replacement for pip, so most commands work similarly
|
||||||
|
2. Existing requirements.txt files are fully compatible
|
||||||
|
3. For best results, start with a fresh virtual environment
|
||||||
|
4. UV includes built-in lockfile support for reproducible environments
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
If you encounter issues:
|
||||||
|
|
||||||
|
- Ensure you have the latest version of UV: `uv self update`
|
||||||
|
- Try running with verbose output: `uv -vvv pip install -r requirements.txt`
|
||||||
|
- Check the [UV documentation](https://github.com/astral-sh/uv) for known issues
|
||||||
75
convert_requirements_to_pyproject.py
Normal file
75
convert_requirements_to_pyproject.py
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Convert requirements.txt to pyproject.toml dependencies
|
||||||
|
"""
|
||||||
|
|
||||||
|
import re
|
||||||
|
import toml
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
def parse_requirements(file_path):
|
||||||
|
"""Parse requirements file into a list of packages."""
|
||||||
|
requirements = []
|
||||||
|
|
||||||
|
with open(file_path, 'r') as f:
|
||||||
|
for line in f:
|
||||||
|
line = line.strip()
|
||||||
|
if line and not line.startswith('#') and not line.startswith('-r'):
|
||||||
|
requirements.append(line)
|
||||||
|
|
||||||
|
return requirements
|
||||||
|
|
||||||
|
def main():
|
||||||
|
project_root = Path(__file__).parent
|
||||||
|
pyproject_path = project_root / "pyproject.toml"
|
||||||
|
|
||||||
|
# Parse requirements
|
||||||
|
requirements = parse_requirements(project_root / "requirements.txt")
|
||||||
|
|
||||||
|
try:
|
||||||
|
advanced_requirements = parse_requirements(project_root / "requirements_advanced.txt")
|
||||||
|
except FileNotFoundError:
|
||||||
|
advanced_requirements = []
|
||||||
|
|
||||||
|
# Load existing pyproject.toml if it exists
|
||||||
|
if pyproject_path.exists():
|
||||||
|
with open(pyproject_path, 'r') as f:
|
||||||
|
pyproject_data = toml.load(f)
|
||||||
|
else:
|
||||||
|
# Create basic structure
|
||||||
|
pyproject_data = {
|
||||||
|
"build-system": {
|
||||||
|
"requires": ["setuptools>=42", "wheel"],
|
||||||
|
"build-backend": "setuptools.build_meta"
|
||||||
|
},
|
||||||
|
"project": {
|
||||||
|
"name": "ComfyUI",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"description": "The most powerful and modular diffusion model GUI, api and backend with a graph/nodes interface.",
|
||||||
|
"readme": "README.md",
|
||||||
|
"requires-python": ">=3.8",
|
||||||
|
"dependencies": requirements
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Update dependencies
|
||||||
|
if "project" not in pyproject_data:
|
||||||
|
pyproject_data["project"] = {}
|
||||||
|
|
||||||
|
pyproject_data["project"]["dependencies"] = requirements
|
||||||
|
|
||||||
|
# Add optional dependencies
|
||||||
|
if advanced_requirements:
|
||||||
|
if "optional-dependencies" not in pyproject_data["project"]:
|
||||||
|
pyproject_data["project"]["optional-dependencies"] = {}
|
||||||
|
|
||||||
|
pyproject_data["project"]["optional-dependencies"]["advanced"] = advanced_requirements
|
||||||
|
|
||||||
|
# Save updated pyproject.toml
|
||||||
|
with open(pyproject_path, 'w') as f:
|
||||||
|
toml.dump(pyproject_data, f)
|
||||||
|
|
||||||
|
print(f"Updated {pyproject_path} with dependencies from requirements files")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
132
install_with_uv.py
Normal file
132
install_with_uv.py
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
ComfyUI Installation Script using UV
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import platform
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
import shutil
|
||||||
|
from pathlib import Path
|
||||||
|
import argparse
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
def check_python_version():
|
||||||
|
"""Check if Python version is supported."""
|
||||||
|
if sys.version_info < (3, 8):
|
||||||
|
print("Python 3.8 or higher is required.")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
def install_uv():
|
||||||
|
"""Install UV if not already installed."""
|
||||||
|
if shutil.which("uv") is None:
|
||||||
|
print("Installing UV package manager...")
|
||||||
|
try:
|
||||||
|
if platform.system() == "Windows":
|
||||||
|
# For Windows, download and run the installer
|
||||||
|
subprocess.check_call(
|
||||||
|
["powershell", "-Command",
|
||||||
|
"Invoke-WebRequest -Uri https://astral.sh/uv/install.ps1 -OutFile install.ps1; ./install.ps1"],
|
||||||
|
stdout=sys.stdout, stderr=sys.stderr
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
# For macOS and Linux
|
||||||
|
subprocess.check_call(
|
||||||
|
["bash", "-c", "curl -LsSf https://astral.sh/uv/install.sh | sh"],
|
||||||
|
stdout=sys.stdout, stderr=sys.stderr
|
||||||
|
)
|
||||||
|
print("UV installed successfully.")
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
print("Failed to install UV. Please install it manually from https://github.com/astral-sh/uv")
|
||||||
|
sys.exit(1)
|
||||||
|
else:
|
||||||
|
print("UV is already installed.")
|
||||||
|
|
||||||
|
def create_venv():
|
||||||
|
"""Create a virtual environment using UV."""
|
||||||
|
print("Creating virtual environment...")
|
||||||
|
try:
|
||||||
|
subprocess.check_call(
|
||||||
|
["uv", "venv", ".venv"],
|
||||||
|
stdout=sys.stdout, stderr=sys.stderr
|
||||||
|
)
|
||||||
|
print("Virtual environment created successfully.")
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
print("Failed to create virtual environment.")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
def activate_venv():
|
||||||
|
"""Return the activation command for the virtual environment."""
|
||||||
|
if platform.system() == "Windows":
|
||||||
|
return str(Path(".venv/Scripts/activate"))
|
||||||
|
return f"source {str(Path('.venv/bin/activate'))}"
|
||||||
|
|
||||||
|
def install_requirements(args):
|
||||||
|
"""Install ComfyUI requirements using UV."""
|
||||||
|
print("Installing requirements...")
|
||||||
|
|
||||||
|
# Basic requirements
|
||||||
|
try:
|
||||||
|
subprocess.check_call(
|
||||||
|
["uv", "pip", "install", "-r", "requirements.txt"],
|
||||||
|
stdout=sys.stdout, stderr=sys.stderr
|
||||||
|
)
|
||||||
|
print("Basic requirements installed successfully.")
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
print("Failed to install basic requirements.")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
# Advanced requirements if specified
|
||||||
|
if args.advanced:
|
||||||
|
try:
|
||||||
|
if os.path.exists("requirements_advanced.txt"):
|
||||||
|
subprocess.check_call(
|
||||||
|
["uv", "pip", "install", "-r", "requirements_advanced.txt"],
|
||||||
|
stdout=sys.stdout, stderr=sys.stderr
|
||||||
|
)
|
||||||
|
print("Advanced requirements installed successfully.")
|
||||||
|
else:
|
||||||
|
print("Advanced requirements file not found.")
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
print("Failed to install advanced requirements.")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
# GPU requirements if specified
|
||||||
|
if args.gpu:
|
||||||
|
print("Installing PyTorch with CUDA support...")
|
||||||
|
try:
|
||||||
|
subprocess.check_call(
|
||||||
|
["uv", "pip", "install", "torch", "torchvision", "torchaudio", "--index-url", "https://download.pytorch.org/whl/cu118"],
|
||||||
|
stdout=sys.stdout, stderr=sys.stderr
|
||||||
|
)
|
||||||
|
print("PyTorch with CUDA installed successfully.")
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
print("Failed to install PyTorch with CUDA.")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser = argparse.ArgumentParser(description="Install ComfyUI with UV package manager")
|
||||||
|
parser.add_argument("--advanced", action="store_true", help="Install advanced requirements")
|
||||||
|
parser.add_argument("--gpu", action="store_true", help="Install PyTorch with CUDA support")
|
||||||
|
parser.add_argument("--no-venv", action="store_true", help="Skip virtual environment creation")
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
print(f"ComfyUI installation with UV started at {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
||||||
|
|
||||||
|
check_python_version()
|
||||||
|
install_uv()
|
||||||
|
|
||||||
|
if not args.no_venv:
|
||||||
|
create_venv()
|
||||||
|
print(f"To activate the virtual environment, run: {activate_venv()}")
|
||||||
|
|
||||||
|
install_requirements(args)
|
||||||
|
|
||||||
|
print("\nComfyUI installation completed successfully!")
|
||||||
|
if not args.no_venv:
|
||||||
|
print(f"Remember to activate the virtual environment with: {activate_venv()}")
|
||||||
|
print("To start ComfyUI, run: python main.py")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@ -1,6 +1,11 @@
|
|||||||
|
[build-system]
|
||||||
|
requires = ["setuptools>=42", "wheel"]
|
||||||
|
build-backend = "setuptools.build_meta"
|
||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "ComfyUI"
|
name = "ComfyUI"
|
||||||
version = "0.3.30"
|
version = "0.3.30"
|
||||||
|
description = "The most powerful and modular diffusion model GUI, api and backend with a graph/nodes interface."
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
license = { file = "LICENSE" }
|
license = { file = "LICENSE" }
|
||||||
requires-python = ">=3.9"
|
requires-python = ">=3.9"
|
||||||
@ -10,6 +15,11 @@ homepage = "https://www.comfy.org/"
|
|||||||
repository = "https://github.com/comfyanonymous/ComfyUI"
|
repository = "https://github.com/comfyanonymous/ComfyUI"
|
||||||
documentation = "https://docs.comfy.org/"
|
documentation = "https://docs.comfy.org/"
|
||||||
|
|
||||||
|
[project.optional-dependencies]
|
||||||
|
advanced = [
|
||||||
|
# Include dependencies from requirements_advanced.txt here
|
||||||
|
]
|
||||||
|
|
||||||
[tool.ruff]
|
[tool.ruff]
|
||||||
lint.select = [
|
lint.select = [
|
||||||
"N805", # invalid-first-argument-name-for-method
|
"N805", # invalid-first-argument-name-for-method
|
||||||
@ -22,3 +32,6 @@ lint.select = [
|
|||||||
"F",
|
"F",
|
||||||
]
|
]
|
||||||
exclude = ["*.ipynb"]
|
exclude = ["*.ipynb"]
|
||||||
|
|
||||||
|
[tool.uv]
|
||||||
|
# Add any uv-specific configurations here
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user