nix-stable-diffusion/flake.nix

288 lines
11 KiB
Nix
Raw Normal View History

2022-10-17 15:06:24 +03:00
{
description = "A very basic flake";
inputs = {
nixlib.url = "github:nix-community/nixpkgs.lib";
nixpkgs = {
url = "github:NixOS/nixpkgs?rev=fd54651f5ffb4a36e8463e0c327a78442b26cbe7";
};
2022-10-22 15:20:17 +03:00
stable-diffusion-repo = {
url = "github:CompVis/stable-diffusion?rev=69ae4b35e0a0f6ee1af8bb9a5d0016ccb27e36dc";
flake = false;
};
2022-10-17 15:06:24 +03:00
};
2022-10-22 15:20:17 +03:00
outputs = { self, nixpkgs, nixlib, stable-diffusion-repo }@inputs:
2022-10-17 15:06:24 +03:00
let
nixlib = inputs.nixlib.outputs.lib;
supportedSystems = [ "x86_64-linux" ];
forAll = nixlib.genAttrs supportedSystems;
2022-10-26 16:19:58 +03:00
requirementsFor = { pkgs, webui ? false }: with pkgs; with pkgs.python3.pkgs; [
python3
torch
torchvision
numpy
2022-10-25 15:45:00 +03:00
# TODO: split SD and InvokeAI deps
albumentations
opencv4
pudb
imageio
imageio-ffmpeg
pytorch-lightning
protobuf3_20
omegaconf
realesrgan
test-tube
streamlit
send2trash
pillow
einops
taming-transformers-rom1504
torch-fidelity
torchmetrics
transformers
flask
flask-socketio
flask-cors
dependency-injector
eventlet
kornia
clip
k-diffusion
gfpgan
2022-10-25 15:45:00 +03:00
] ++ nixlib.optional webui [
addict
future
lmdb
pyyaml
scikitimage
tqdm
yapf
gdown
lpips
fastapi
lark
analytics-python
ffmpy
markdown-it-py
shap
gradio
fonts
font-roboto
piexif
websockets
codeformer
blip
];
overlay_default = nixpkgs: pythonPackages:
{
pytorch-lightning = pythonPackages.pytorch-lightning.overrideAttrs (old: {
nativeBuildInputs = old.nativeBuildInputs ++ [ nixpkgs.python3Packages.pythonRelaxDepsHook ];
pythonRelaxDeps = [ "protobuf" ];
});
wandb = pythonPackages.wandb.overrideAttrs (old: {
nativeBuildInputs = old.nativeBuildInputs ++ [ nixpkgs.python3Packages.pythonRelaxDepsHook ];
pythonRelaxDeps = [ "protobuf" ];
});
streamlit = nixpkgs.streamlit.overrideAttrs (old: {
nativeBuildInputs = old.nativeBuildInputs ++ [ nixpkgs.python3Packages.pythonRelaxDepsHook ];
pythonRelaxDeps = [ "protobuf" ];
});
scikit-image = pythonPackages.scikitimage;
};
overlay_webui = nixpkgs: pythonPackages:
{
transformers = pythonPackages.transformers.overrideAttrs (old: {
src = nixpkgs.fetchFromGitHub {
owner = "huggingface";
repo = "transformers";
rev = "refs/tags/v4.19.2";
hash = "sha256-9r/1vW7Rhv9+Swxdzu5PTnlQlT8ofJeZamHf5X4ql8w=";
};
});
};
overlay_pynixify = self:
let
rm = d: d.overrideAttrs (old: {
nativeBuildInputs = old.nativeBuildInputs ++ [ self.pythonRelaxDepsHook ];
pythonRemoveDeps = [ "opencv-python-headless" "opencv-python" "tb-nightly" ];
});
callPackage = self.callPackage;
rmCallPackage = path: args: rm (callPackage path args);
in
rec {
pydeprecate = callPackage ./packages/pydeprecate { };
taming-transformers-rom1504 =
callPackage ./packages/taming-transformers-rom1504 { };
albumentations = rmCallPackage ./packages/albumentations { opencv-python-headless = self.opencv4; };
qudida = rmCallPackage ./packages/qudida { opencv-python-headless = self.opencv4; };
gfpgan = rmCallPackage ./packages/gfpgan { opencv-python = self.opencv4; };
basicsr = rmCallPackage ./packages/basicsr { opencv-python = self.opencv4; };
facexlib = rmCallPackage ./packages/facexlib { opencv-python = self.opencv4; };
realesrgan = rmCallPackage ./packages/realesrgan { opencv-python = self.opencv4; };
2022-10-23 16:38:53 +03:00
codeformer = callPackage ./packages/codeformer { opencv-python = self.opencv4; };
filterpy = callPackage ./packages/filterpy { };
kornia = callPackage ./packages/kornia { };
lpips = callPackage ./packages/lpips { };
2022-10-21 15:00:33 +03:00
ffmpy = callPackage ./packages/ffmpy { };
2022-10-21 15:10:30 +03:00
shap = callPackage ./packages/shap { };
2022-10-21 15:54:17 +03:00
fonts = callPackage ./packages/fonts { };
2022-10-21 16:32:41 +03:00
font-roboto = callPackage ./packages/font-roboto { };
2022-10-21 15:00:33 +03:00
analytics-python = callPackage ./packages/analytics-python { };
markdown-it-py = callPackage ./packages/markdown-it-py { };
2022-10-21 14:00:21 +03:00
gradio = callPackage ./packages/gradio { };
2022-10-22 15:20:17 +03:00
hatch-requirements-txt = callPackage ./packages/hatch-requirements-txt { };
2022-10-25 15:45:00 +03:00
timm = callPackage ./packages/timm { };
blip = callPackage ./packages/blip { };
fairscale = callPackage ./packages/fairscale { };
torch-fidelity = callPackage ./packages/torch-fidelity { };
resize-right = callPackage ./packages/resize-right { };
torchdiffeq = callPackage ./packages/torchdiffeq { };
k-diffusion = callPackage ./packages/k-diffusion { clean-fid = self.clean-fid; };
accelerate = callPackage ./packages/accelerate { };
clip-anytorch = callPackage ./packages/clip-anytorch { };
jsonmerge = callPackage ./packages/jsonmerge { };
clean-fid = callPackage ./packages/clean-fid { };
};
overlay_amd = nixpkgs: pythonPackages:
rec {
torch-bin = pythonPackages.torch-bin.overrideAttrs (old: {
src = nixpkgs.fetchurl {
name = "torch-1.12.1+rocm5.1.1-cp310-cp310-linux_x86_64.whl";
url = "https://download.pytorch.org/whl/rocm5.1.1/torch-1.12.1%2Brocm5.1.1-cp310-cp310-linux_x86_64.whl";
hash = "sha256-kNShDx88BZjRQhWgnsaJAT8hXnStVMU1ugPNMEJcgnA=";
};
});
torchvision-bin = pythonPackages.torchvision-bin.overrideAttrs (old: {
src = nixpkgs.fetchurl {
name = "torchvision-0.13.1+rocm5.1.1-cp310-cp310-linux_x86_64.whl";
url = "https://download.pytorch.org/whl/rocm5.1.1/torchvision-0.13.1%2Brocm5.1.1-cp310-cp310-linux_x86_64.whl";
hash = "sha256-mYk4+XNXU6rjpgWfKUDq+5fH/HNPQ5wkEtAgJUDN/Jg=";
};
});
torch = torch-bin;
torchvision = torchvision-bin;
#overriding because of https://github.com/NixOS/nixpkgs/issues/196653
opencv4 = pythonPackages.opencv4.override { openblas = nixpkgs.blas; };
};
overlay_nvidia = nixpkgs: pythonPackages:
{
torch = pythonPackages.torch.override {
cudaSupport = true;
};
};
2022-10-17 15:06:24 +03:00
in
{
devShells = forAll
(system:
let
2022-10-25 15:45:00 +03:00
mkShell = inputs.nixpkgs.legacyPackages.${system}.mkShell;
nixpkgs_ = { amd ? false, nvidia ? false, webui ? false }:
import inputs.nixpkgs {
inherit system;
config.allowUnfree = nvidia; #CUDA is unfree.
overlays = [
(final: prev:
let optional = nixlib.optionalAttrs; in
{
python3 = prev.python3.override {
packageOverrides =
python-self: python-super:
(overlay_default prev python-super) //
optional amd (overlay_amd prev python-super) //
optional nvidia (overlay_amd prev python-super) //
optional webui (overlay_webui prev python-super) //
2022-10-25 15:45:00 +03:00
(overlay_pynixify python-self);
};
})
];
};
2022-10-17 15:06:24 +03:00
in
rec {
2022-10-25 15:45:00 +03:00
invokeai =
let
shellHook = ''
cd InvokeAI
'';
in
{
default = mkShell
({
inherit shellHook;
name = "invokeai";
2022-10-26 16:19:58 +03:00
propagatedBuildInputs = requirementsFor { pkgs = (nixpkgs_ { }); };
2022-10-25 15:45:00 +03:00
});
amd = mkShell
({
inherit shellHook;
name = "invokeai.amd";
2022-10-26 16:19:58 +03:00
propagatedBuildInputs = requirementsFor { pkgs = (nixpkgs_ { amd = true; }); };
2022-10-25 15:45:00 +03:00
});
nvidia = mkShell
({
inherit shellHook;
name = "invokeai.nvidia";
2022-10-26 16:19:58 +03:00
propagatedBuildInputs = requirementsFor { pkgs = (nixpkgs_ { nvidia = true; }); };
2022-10-25 15:45:00 +03:00
});
};
webui =
let
2022-10-26 16:19:58 +03:00
shellHookFor = nixpkgs:
let
submodel = pkg: nixpkgs.pkgs.python3.pkgs.${pkg} + "/lib/python3.10/site-packages";
taming-transformers = submodel "taming-transformers-rom1504";
k_diffusion = submodel "k-diffusion";
codeformer = (submodel "codeformer") + "/codeformer";
blip = (submodel "blip") + "/blip";
in
''
cd stable-diffusion-webui
git reset --hard HEAD
git apply ${./webui.patch}
rm -rf repositories/
mkdir repositories
ln -s ${inputs.stable-diffusion-repo}/ repositories/stable-diffusion
substituteInPlace modules/paths.py \
--subst-var-by taming_transformers ${taming-transformers} \
--subst-var-by k_diffusion ${k_diffusion} \
--subst-var-by codeformer ${codeformer} \
--subst-var-by blip ${blip}
'';
2022-10-25 15:45:00 +03:00
in
{
default = mkShell
(
let args = { pkgs = (nixpkgs_ { webui = true; }); webui = true; }; in
{
shellHook = shellHookFor args.pkgs;
name = "webui";
propagatedBuildInputs = requirementsFor args.pkgs;
}
);
2022-10-25 15:45:00 +03:00
amd = mkShell
(
let args = { pkgs = (nixpkgs_ { webui = true; amd = true; }); webui = true; }; in
{
shellHook = shellHookFor args.pkgs;
name = "webui.amd";
propagatedBuildInputs = requirementsFor args;
}
);
2022-10-25 15:45:00 +03:00
nvidia = mkShell
(
let args = { pkgs = (nixpkgs_ { webui = true; nvidia = true; }); webui = true; }; in
{
shellHook = shellHookFor args.pkgs;
name = "webui.nvidia";
propagatedBuildInputs = requirementsFor args;
}
);
2022-10-25 15:45:00 +03:00
};
default = invokeai.amd;
2022-10-17 15:06:24 +03:00
});
};
}