flake/flake.nix
matthewcroughan 5615f114d7 init
2023-02-11 22:54:48 +00:00

210 lines
8.5 KiB
Nix

{
description = "A very basic flake";
inputs = {
nixpkgs = {
url = "github:NixOS/nixpkgs/nixos-unstable"; # ?rev=fd54651f5ffb4a36e8463e0c327a78442b26cbe7";
};
invokeai-src = {
url = "github:invoke-ai/InvokeAI/v2.2.5";
flake = false;
};
flake-parts = {
url = "github:hercules-ci/flake-parts";
inputs.nixpkgs-lib.follows = "nixpkgs";
};
};
outputs = { flake-parts, invokeai-src, ... }@inputs:
flake-parts.lib.mkFlake { inherit inputs; } ({ inputs, lib, ... }: {
systems = [
"x86_64-linux"
];
perSystem = { system, ... }:
let
pkgs = import inputs.nixpkgs {
inherit system;
config.allowUnfree = true;
};
python3 = pkgs.python3.override {
packageOverrides = lib.composeManyExtensions [
overlay_default
overlay_pynixify
overlay_amd
];
};
requirements = with python3.pkgs; rec {
base = [
numpy
albumentations
opencv4
pudb
imageio
imageio-ffmpeg
pytorch-lightning
protobuf
omegaconf
test-tube
((pkgs.streamlit.overrideAttrs (old: {
nativeBuildInputs = old.nativeBuildInputs ++ [ pythonRelaxDepsHook ];
pythonRelaxDeps = [ "protobuf" ];
})).override { protobuf3 = protobuf; })
einops
taming-transformers-rom1504
torch-fidelity
torchmetrics
transformers
kornia
k-diffusion
picklescan
diffusers
pypatchmatch
# following packages not needed for vanilla SD but used by both UIs
realesrgan
pillow
];
invokeai = base ++ [
send2trash
flask
flask-socketio
flask-cors
dependency-injector
gfpgan
eventlet
clipseg
getpass-asterisk
];
};
overlay_default = final: prev:
{
pytorch-lightning = prev.pytorch-lightning.overrideAttrs (old: {
nativeBuildInputs = old.nativeBuildInputs ++ [ final.pythonRelaxDepsHook ];
pythonRelaxDeps = [ "protobuf" ];
});
wandb = prev.wandb.overrideAttrs (old: {
nativeBuildInputs = old.nativeBuildInputs ++ [ final.pythonRelaxDepsHook ];
pythonRelaxDeps = [ "protobuf" ];
});
scikit-image = final.scikitimage;
};
overlay_pynixify = final: prev:
let
rm = d: d.overrideAttrs (old: {
nativeBuildInputs = old.nativeBuildInputs ++ [ final.pythonRelaxDepsHook ];
pythonRemoveDeps = [ "opencv-python-headless" "opencv-python" "tb-nightly" "clip" ];
});
callPackage = final.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 = final.opencv4; };
qudida = rmCallPackage ./packages/qudida { opencv-python-headless = final.opencv4; };
gfpgan = rmCallPackage ./packages/gfpgan { opencv-python = final.opencv4; };
basicsr = rmCallPackage ./packages/basicsr { opencv-python = final.opencv4; };
facexlib = rmCallPackage ./packages/facexlib { opencv-python = final.opencv4; };
realesrgan = rmCallPackage ./packages/realesrgan { opencv-python = final.opencv4; };
codeformer = callPackage ./packages/codeformer { opencv-python = final.opencv4; };
clipseg = rmCallPackage ./packages/clipseg { opencv-python = final.opencv4; };
filterpy = callPackage ./packages/filterpy { };
kornia = callPackage ./packages/kornia { };
lpips = callPackage ./packages/lpips { };
ffmpy = callPackage ./packages/ffmpy { };
shap = callPackage ./packages/shap { };
picklescan = callPackage ./packages/picklescan { };
diffusers = callPackage ./packages/diffusers { };
pypatchmatch = callPackage ./packages/pypatchmatch { };
fonts = callPackage ./packages/fonts { };
font-roboto = callPackage ./packages/font-roboto { };
analytics-python = callPackage ./packages/analytics-python { };
markdown-it-py = callPackage ./packages/markdown-it-py { };
gradio = callPackage ./packages/gradio { };
hatch-requirements-txt = callPackage ./packages/hatch-requirements-txt { };
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 = final.clean-fid; };
accelerate = callPackage ./packages/accelerate { };
clip-anytorch = callPackage ./packages/clip-anytorch { };
jsonmerge = callPackage ./packages/jsonmerge { };
clean-fid = callPackage ./packages/clean-fid { };
getpass-asterisk = callPackage ./packages/getpass-asterisk { };
};
overlay_amd = final: prev:
rec {
# TODO: figure out how to patch torch-bin trying to access /opt/amdgpu
# there might be an environment variable for it, can use a wrapper for that
# otherwise just grep the world for /opt/amdgpu or something and substituteInPlace the path
# you can run this thing without the fix by creating /opt and running nix build nixpkgs#libdrm --inputs-from . --out-link /opt/amdgpu
torch-bin = prev.torch-bin.overrideAttrs (old: {
src = pkgs.fetchurl {
name = "torch-1.13.1+rocm5.1.1-cp310-cp310-linux_x86_64.whl";
url = "https://download.pytorch.org/whl/rocm5.1.1/torch-1.13.1%2Brocm5.1.1-cp310-cp310-linux_x86_64.whl";
hash = "sha256-qUwAL3L9ODy9hjne8jZQRoG4BxvXXLT7cAy9RbM837A=";
};
});
torchvision-bin = prev.torchvision-bin.overrideAttrs (old: {
src = pkgs.fetchurl {
name = "torchvision-0.14.1+rocm5.1.1-cp310-cp310-linux_x86_64.whl";
url = "https://download.pytorch.org/whl/rocm5.1.1/torchvision-0.14.1%2Brocm5.1.1-cp310-cp310-linux_x86_64.whl";
hash = "sha256-8CM1QZ9cZfexa+HWhG4SfA/PTGB2475dxoOtGZ3Wa2E=";
};
});
torch = torch-bin;
torchvision = torchvision-bin;
#torch = pythonPackages.torch.override {
# rocmSupport = true;
# magma = nixpkgs.magma-hip;
#};
huggingface-hub = prev.huggingface-hub.overrideAttrs(_: {
src = pkgs.fetchFromGitHub {
owner = "huggingface";
repo = "huggingface_hub";
rev = "refs/tags/v0.11.0";
hash = "sha256-d+X4hGt4K6xmRFw8mevKpZ6RDv+U1PJ8WbmdKGDbVNs=";
};
});
#overriding because of https://github.com/NixOS/nixpkgs/issues/196653
opencv4 = prev.opencv4.override { openblas = pkgs.blas; };
};
overlay_nvidia = final: prev:
{
torch = final.torch-bin;
torchvision = final.torchvision-bin;
huggingface-hub = prev.huggingface-hub.overrideAttrs(_: {
src = pkgs.fetchFromGitHub {
owner = "huggingface";
repo = "huggingface_hub";
rev = "refs/tags/v0.11.0";
hash = "sha256-d+X4hGt4K6xmRFw8mevKpZ6RDv+U1PJ8WbmdKGDbVNs=";
};
});
opencv4 = prev.opencv4.override { openblas = pkgs.blas; };
};
in
{
packages = {
invokeai-amd = python3.pkgs.buildPythonPackage {
pname = "InvokeAI";
version = toString (builtins.match ".+VERSION = '([^']+)'.+" (builtins.readFile "${inputs.invokeai-src}/setup.py"));
src = invokeai-src;
propagatedBuildInputs = requirements.invokeai;
nativeBuildInputs = [ python3.pkgs.pythonRelaxDepsHook ];
pythonRemoveDeps = [ "clip" "pyreadline3" "flaskwebgui" ];
pythonRelaxDeps = [ "protobuf" ];
postFixup = ''
chmod +x $out/bin/*
wrapPythonPrograms
'';
doCheck = false;
};
};
};
});
}