nix-stable-diffusion/flake.nix

327 lines
12 KiB
Nix
Raw Normal View History

2022-10-17 15:06:24 +03:00
{
2023-03-12 09:14:06 +03:00
description = "Nix Flake for runnig Stable Diffusion on NixOS";
2022-10-17 15:06:24 +03:00
inputs = {
nixlib.url = "github:nix-community/nixpkgs.lib";
nixpkgs = {
url = "github:NixOS/nixpkgs"; #?rev=33919d25f0c873b0c73e2f8d0859fab3bd0d1b26";
2022-10-17 15:06:24 +03:00
};
2022-10-22 15:20:17 +03:00
stable-diffusion-repo = {
url = "github:Stability-AI/stablediffusion?rev=47b6b607fdd31875c9279cd2f4f16b92e4ea958e";
2022-10-22 15:20:17 +03:00
flake = false;
};
2023-03-01 15:50:42 +03:00
invokeai-repo = {
url = "github:invoke-ai/InvokeAI?ref=v2.3.1.post2";
flake = false;
};
2022-10-17 15:06:24 +03:00
};
2023-03-01 15:50:42 +03:00
outputs = { self, nixpkgs, nixlib, stable-diffusion-repo, invokeai-repo }@inputs:
2022-10-17 15:06:24 +03:00
let
nixlib = inputs.nixlib.outputs.lib;
2023-03-01 15:50:42 +03:00
system = "x86_64-linux";
2022-10-26 16:19:58 +03:00
requirementsFor = { pkgs, webui ? false }: with pkgs; with pkgs.python3.pkgs; [
python3
torch
torchvision
numpy
albumentations
opencv4
pudb
imageio
imageio-ffmpeg
pytorch-lightning
omegaconf
test-tube
streamlit
protobuf
einops
taming-transformers-rom1504
torch-fidelity
torchmetrics
transformers
2022-11-15 16:28:13 +03:00
kornia
k-diffusion
2023-03-01 15:50:42 +03:00
diffusers
2022-11-15 16:28:13 +03:00
# following packages not needed for vanilla SD but used by both UIs
realesrgan
pillow
safetensors
]
2022-11-15 16:28:13 +03:00
++ nixlib.optional (!webui) [
2023-02-28 15:10:05 +03:00
npyscreen
huggingface-hub
dnspython
datasets
click
pypatchmatch
2023-02-28 15:39:23 +03:00
torchsde
2023-03-01 15:50:42 +03:00
compel
2022-11-15 16:28:13 +03:00
send2trash
flask
flask-socketio
flask-cors
gfpgan
2022-11-15 16:28:13 +03:00
eventlet
clipseg
getpass-asterisk
picklescan
2022-11-15 16:28:13 +03:00
]
++ nixlib.optional webui [
2022-10-25 15:45:00 +03:00
addict
future
lmdb
pyyaml
scikitimage
tqdm
yapf
gdown
lpips
fastapi
lark
analytics-python
ffmpy
markdown-it-py
shap
gradio
fonts
font-roboto
piexif
codeformer
blip
psutil
openclip
];
overlay_default = nixpkgs: pythonPackages:
{
pytorch-lightning = pythonPackages.pytorch-lightning.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" "clip" ];
});
callPackage = self.callPackage;
rmCallPackage = path: args: rm (callPackage path args);
mapCallPackage = pnames: builtins.listToAttrs (builtins.map (pname: { name = pname; value = (callPackage (./packages + "/${pname}") { }); }) pnames);
simplePackages = [
"filterpy"
"kornia"
"lpips"
"ffmpy"
"shap"
"fonts"
"font-roboto"
"analytics-python"
"markdown-it-py"
"gradio"
"hatch-requirements-txt"
"timm"
"blip"
"fairscale"
"torch-fidelity"
"resize-right"
"torchdiffeq"
"accelerate"
"clip-anytorch"
"jsonmerge"
"clean-fid"
"getpass-asterisk"
"pypatchmatch"
"trampoline"
"torchsde"
"compel"
"diffusers"
"safetensors"
"picklescan"
"openclip"
];
in
2023-03-11 06:56:53 +03:00
{
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; };
2022-10-23 16:38:53 +03:00
codeformer = callPackage ./packages/codeformer { opencv-python = self.opencv4; };
realesrgan = rmCallPackage ./packages/realesrgan { opencv-python = self.opencv4; };
clipseg = rmCallPackage ./packages/clipseg { opencv-python = self.opencv4; };
k-diffusion = callPackage ./packages/k-diffusion { clean-fid = self.clean-fid; };
} // mapCallPackage simplePackages;
overlay_amd = nixpkgs: pythonPackages:
rec {
2023-03-11 06:56:53 +03:00
#IMPORTANT: you can browse available wheels on the server, but only if you add trailing "/" - e.g. https://download.pytorch.org/whl/rocm5.2/
torch-bin = pythonPackages.torch-bin.overrideAttrs (old: {
src = nixpkgs.fetchurl {
2023-03-11 06:56:53 +03:00
name = "torch-1.13.1+rocm5.2-cp310-cp310-linux_x86_64.whl";
url = "https://download.pytorch.org/whl/rocm5.2/torch-1.13.1%2Brocm5.2-cp310-cp310-linux_x86_64.whl";
hash = "sha256-82hdCKwNjJUcw2f5vUsskkxdRRdmnEdoB3SKvNlmE28=";
};
});
torchvision-bin = pythonPackages.torchvision-bin.overrideAttrs (old: {
src = nixpkgs.fetchurl {
2023-03-11 06:56:53 +03:00
name = "torchvision-0.14.1+rocm5.2-cp310-cp310-linux_x86_64.whl";
url = "https://download.pytorch.org/whl/rocm5.2/torchvision-0.14.1%2Brocm5.2-cp310-cp310-linux_x86_64.whl";
hash = "sha256-oBYG/K7bgkxu0UvmyS2U1ud2LkFQ/CarcxpEJ9xzMYQ=";
};
});
torch = torch-bin;
torchvision = torchvision-bin;
};
overlay_nvidia = nixpkgs: pythonPackages:
{
torch = pythonPackages.torch-bin;
torchvision = pythonPackages.torchvision-bin;
};
2022-10-17 15:06:24 +03:00
in
2023-03-01 15:50:42 +03:00
let
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;
sl = (prev.streamlit.override ({ protobuf3 = prev.protobuf; }));
makePythonHook = args: final.makeSetupHook ({ passthru.provides.setupHook = true; } // args);
pythonRelaxDepsHook = prev.callPackage
({ wheel }:
makePythonHook
{
name = "python-relax-deps-hook";
propagatedBuildInputs = [ wheel ];
substitutions = {
pythonInterpreter = nixlib.getExe prev.python3Packages.python;
};
} ./python-relax-deps-hook.sh)
{ wheel = prev.python3.pkgs.wheel; };
in
2023-03-01 15:50:42 +03:00
{
inherit pythonRelaxDepsHook;
streamlit = sl.overrideAttrs (old: {
nativeBuildInputs = old.nativeBuildInputs ++ [ pythonRelaxDepsHook ];
pythonRemoveDeps = [ "protobuf" ];
2023-03-01 15:50:42 +03:00
});
python3 = prev.python3.override {
packageOverrides =
python-self: python-super:
(overlay_default prev python-super) //
optional amd (overlay_amd prev python-super) //
optional nvidia (overlay_nvidia prev python-super) //
optional webui (overlay_webui prev python-super) //
(overlay_pynixify python-self);
};
})
];
};
in
2022-10-17 15:06:24 +03:00
{
2023-03-01 15:50:42 +03:00
packages.${system} =
let
2023-03-12 09:14:06 +03:00
nixpkgs = (nixpkgs_ { });
nixpkgsAmd = (nixpkgs_ { amd = true; });
nixpkgsNvidia = (nixpkgs_ { nvidia = true; });
invokeaiF = nixpkgs: nixpkgs.python3.pkgs.buildPythonPackage {
pname = "invokeai";
version = "2.3.1";
src = invokeai-repo;
format = "pyproject";
propagatedBuildInputs = requirementsFor { pkgs = nixpkgs; };
nativeBuildInputs = [ nixpkgs.pkgs.pythonRelaxDepsHook ];
pythonRelaxDeps = [ "torch" "pytorch-lightning" "flask-socketio" "flask" "dnspython" ];
pythonRemoveDeps = [ "opencv-python" "flaskwebgui" "pyreadline3" ];
};
2023-03-12 09:14:06 +03:00
in
{
invokeai = {
amd = invokeaiF nixpkgsAmd;
nvidia = invokeaiF nixpkgsNvidia;
default = invokeaiF nixpkgs;
2023-03-01 15:50:42 +03:00
};
};
devShells.${system} =
{
2023-03-01 15:50:42 +03:00
webui =
let
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";
joinedModels = nixpkgs.symlinkJoin { name = "webui-models"; paths = [ inputs.stable-diffusion-repo taming-transformers k_diffusion codeformer blip ]; };
2023-03-01 15:50:42 +03:00
in
''
cd stable-diffusion-webui
#git reset --hard HEAD
#git apply ${./webui.patch}
2023-03-01 15:50:42 +03:00
rm -rf repositories/
mkdir repositories
pushd repositories
ln -s ${inputs.stable-diffusion-repo}/ stable-diffusion-stability-ai
ln -s ${taming-transformers}/ taming-transformers
ln -s ${k_diffusion}/ k-diffusion
ln -s ${codeformer}/ CodeFormer
ln -s ${blip}/ BLIP
popd
/* 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
'';
2023-03-01 15:50:42 +03:00
in
{
default = mkShell
(
let args = { pkgs = (nixpkgs_ { webui = true; }); webui = true; }; in
{
shellHook = shellHookFor args.pkgs;
name = "webui";
propagatedBuildInputs = requirementsFor args.pkgs;
}
);
amd = mkShell
(
let args = { pkgs = (nixpkgs_ { webui = true; amd = true; }); webui = true; }; in
{
shellHook = shellHookFor args.pkgs;
name = "webui.amd";
propagatedBuildInputs = requirementsFor args;
}
);
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-17 15:06:24 +03:00
};
}