This commit is contained in:
Denis Manherz 2023-11-25 23:39:37 +01:00
parent 778f1e59e1
commit 5bf9ff997e
15 changed files with 809 additions and 506 deletions

View file

@ -215,6 +215,22 @@
"type": "github" "type": "github"
} }
}, },
"nixpkgs-stable": {
"locked": {
"lastModified": 1700403855,
"narHash": "sha256-Q0Uzjik9kUTN9pd/kp52XJi5kletBhy29ctBlAG+III=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "0c5678df521e1407884205fe3ce3cf1d7df297db",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-23.05",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_2": { "nixpkgs_2": {
"locked": { "locked": {
"lastModified": 1697059129, "lastModified": 1697059129,
@ -240,6 +256,7 @@
"invokeai-src": "invokeai-src", "invokeai-src": "invokeai-src",
"kohya_ss-src": "kohya_ss-src", "kohya_ss-src": "kohya_ss-src",
"nixpkgs": "nixpkgs_2", "nixpkgs": "nixpkgs_2",
"nixpkgs-stable": "nixpkgs-stable",
"sd-src": "sd-src", "sd-src": "sd-src",
"sgm-src": "sgm-src", "sgm-src": "sgm-src",
"textgen-src": "textgen-src" "textgen-src": "textgen-src"

View file

@ -7,6 +7,9 @@
description = "A Nix Flake that makes AI reproducible and easy to run"; description = "A Nix Flake that makes AI reproducible and easy to run";
inputs = { inputs = {
nixpkgs-stable = {
url = github:NixOS/nixpkgs/nixos-23.05;
};
bark-gui-src = { bark-gui-src = {
url = "github:C0untFloyd/bark-gui"; url = "github:C0untFloyd/bark-gui";
flake = false; flake = false;
@ -49,7 +52,7 @@
}; };
outputs = { flake-parts, invokeai-src, hercules-ci-effects, ... }@inputs: outputs = { flake-parts, invokeai-src, hercules-ci-effects, ... }@inputs:
flake-parts.lib.mkFlake { inherit inputs; } { flake-parts.lib.mkFlake { inherit inputs; } {
perSystem = { system, ... }: { perSystem = { system, ... }:{
_module.args.pkgs = import inputs.nixpkgs { config.allowUnfree = true; inherit system; }; _module.args.pkgs = import inputs.nixpkgs { config.allowUnfree = true; inherit system; };
legacyPackages = { legacyPackages = {
koboldai = builtins.throw '' koboldai = builtins.throw ''

View file

@ -1,51 +1,57 @@
lib: { lib: {
fixPackages = final: prev: let fixPackages = final: prev:
relaxProtobuf = pkg: pkg.overrideAttrs (old: { let
nativeBuildInputs = old.nativeBuildInputs ++ [ final.pythonRelaxDepsHook ]; relaxProtobuf = pkg: pkg.overrideAttrs (old: {
pythonRelaxDeps = [ "protobuf" ]; nativeBuildInputs = old.nativeBuildInputs ++ [ final.pythonRelaxDepsHook ];
}); pythonRelaxDeps = [ "protobuf" ];
in { });
invisible-watermark = prev.invisible-watermark.overridePythonAttrs { in
pythonImportsCheck = [ ]; {
}; invisible-watermark = prev.invisible-watermark.overridePythonAttrs {
torchsde = prev.torchsde.overridePythonAttrs { doCheck = false; pythonImportsCheck = [ ];
pythonImportsCheck = []; }; };
pytorch-lightning = relaxProtobuf prev.pytorch-lightning; torchsde = prev.torchsde.overridePythonAttrs {
wandb = relaxProtobuf (prev.wandb.overridePythonAttrs { doCheck = false;
doCheck = false; pythonImportsCheck = [ ];
}); };
anyio = prev.anyio.overridePythonAttrs { doCheck = false; dontUsePytestCheck = true;}; pytorch-lightning = relaxProtobuf prev.pytorch-lightning;
mocket = prev.mocket.overridePythonAttrs { doCheck = false; dontUsePytestCheck = true;}; wandb = relaxProtobuf (prev.wandb.overridePythonAttrs {
markdown-it-py = prev.markdown-it-py.overrideAttrs (old: { doCheck = false;
nativeBuildInputs = old.nativeBuildInputs ++ [ final.pythonRelaxDepsHook ]; });
pythonRelaxDeps = [ "linkify-it-py" ]; anyio = prev.anyio.overridePythonAttrs { doCheck = false; dontUsePytestCheck = true; };
passthru = old.passthru // { mocket = prev.mocket.overridePythonAttrs { doCheck = false; dontUsePytestCheck = true; };
optional-dependencies = with final; { markdown-it-py = prev.markdown-it-py.overrideAttrs (old: {
linkify = [ linkify-it-py ]; nativeBuildInputs = old.nativeBuildInputs ++ [ final.pythonRelaxDepsHook ];
plugins = [ mdit-py-plugins ]; pythonRelaxDeps = [ "linkify-it-py" ];
passthru = old.passthru // {
optional-dependencies = with final; {
linkify = [ linkify-it-py ];
plugins = [ mdit-py-plugins ];
};
}; };
}; });
}); filterpy = prev.filterpy.overrideAttrs (old: {
filterpy = prev.filterpy.overrideAttrs (old: { doInstallCheck = false;
doInstallCheck = false; });
}); shap = prev.shap.overrideAttrs (old: {
shap = prev.shap.overrideAttrs (old: { doInstallCheck = false;
doInstallCheck = false; propagatedBuildInputs = old.propagatedBuildInputs ++ [ final.packaging ];
propagatedBuildInputs = old.propagatedBuildInputs ++ [ final.packaging ]; pythonImportsCheck = [ "shap" ];
pythonImportsCheck = [ "shap" ];
meta = old.meta // { meta = old.meta // {
broken = false; broken = false;
}; };
}); });
streamlit = let streamlit =
streamlit = final.callPackage (final.pkgs.path + "/pkgs/applications/science/machine-learning/streamlit") { let
protobuf3 = final.protobuf; streamlit = final.callPackage (final.pkgs.path + "/pkgs/applications/science/machine-learning/streamlit") {
}; protobuf3 = final.protobuf;
in final.toPythonModule (relaxProtobuf streamlit); };
opencv-python-headless = final.opencv-python; in
opencv-python = final.opencv4; final.toPythonModule (relaxProtobuf streamlit);
}; opencv-python-headless = final.opencv-python;
opencv-python = final.opencv4;
};
torchRocm = final: prev: { torchRocm = final: prev: {
torch = prev.torch.override { torch = prev.torch.override {
@ -54,7 +60,7 @@ lib: {
rocmSupport = true; rocmSupport = true;
}; };
torchvision = prev.torchvision.overridePythonAttrs (old: { torchvision = prev.torchvision.overridePythonAttrs (old: {
patches = (old.patches or []) ++ [ ./torchvision/fix-rocm-build.patch ]; patches = (old.patches or [ ]) ++ [ ./torchvision/fix-rocm-build.patch ];
}); });
}; };

View file

@ -0,0 +1,42 @@
{ lib
, stdenv
, buildPythonPackage
, pythonOlder
, fetchPypi
, isPyPy
, defusedxml, olefile, freetype, libjpeg, zlib, libtiff, libwebp, libxcrypt, tcl, lcms2, tk, libX11
, libxcb, openjpeg, libimagequant, pyroma, numpy, pytestCheckHook
# for passthru.tests
, imageio, matplotlib, pilkit, pydicom, reportlab
}@args:
import ./generic.nix (rec {
pname = "pillow";
version = "9.4.0";
format = "setuptools";
disabled = pythonOlder "3.7";
src = fetchPypi {
pname = "Pillow";
inherit version;
hash = "sha256-ocLXeARI65P7zDeJvzkWqlcg2ULjeUX0BWaAMX8c0j4=";
};
passthru.tests = {
inherit imageio matplotlib pilkit pydicom reportlab;
};
meta = with lib; {
homepage = "https://python-pillow.org/";
description = "The friendly PIL fork (Python Imaging Library)";
longDescription = ''
The Python Imaging Library (PIL) adds image processing
capabilities to your Python interpreter. This library
supports many file formats, and provides powerful image
processing and graphics capabilities.
'';
license = licenses.hpnd;
maintainers = with maintainers; [ goibhniu prikhi SuperSandro2000 ];
};
} // args )

View file

@ -0,0 +1,81 @@
{ pname
, version
, disabled
, src
, patches ? []
, meta
, passthru ? {}
, ...
}@args:
with args;
buildPythonPackage rec {
inherit pname version format src meta passthru patches;
# Disable imagefont tests, because they don't work well with infinality:
# https://github.com/python-pillow/Pillow/issues/1259
postPatch = ''
rm Tests/test_imagefont.py
'';
disabledTests = [
# Code quality mismathch 9 vs 10
"test_pyroma"
# pillow-simd
"test_roundtrip"
"test_basic"
"test_custom_metadata"
"test_file_png"
] ++ lib.optionals stdenv.isDarwin [
# Disable darwin tests which require executables: `iconutil` and `screencapture`
"test_grab"
"test_grabclipboard"
"test_save"
];
propagatedBuildInputs = [ olefile ]
++ lib.optionals (lib.versionAtLeast version "8.2.0") [ defusedxml ];
nativeCheckInputs = [ pytestCheckHook pyroma numpy ];
buildInputs = [ freetype libjpeg openjpeg libimagequant zlib libtiff libwebp libxcrypt tcl lcms2 ]
++ lib.optionals (lib.versionAtLeast version "7.1.0") [ libxcb ]
++ lib.optionals (isPyPy) [ tk libX11 ];
# NOTE: we use LCMS_ROOT as WEBP root since there is not other setting for webp.
# NOTE: The Pillow install script will, by default, add paths like /usr/lib
# and /usr/include to the search paths. This can break things when building
# on a non-NixOS system that has some libraries installed that are not
# installed in Nix (for example, Arch Linux has jpeg2000 but Nix doesn't
# build Pillow with this support). We patch the `disable_platform_guessing`
# setting here, instead of passing the `--disable-platform-guessing`
# command-line option, since the command-line option doesn't work when we run
# tests.
preConfigure = let
libinclude' = pkg: ''"${pkg.out}/lib", "${pkg.out}/include"'';
libinclude = pkg: ''"${pkg.out}/lib", "${pkg.dev}/include"'';
in ''
sed -i "setup.py" \
-e 's|^FREETYPE_ROOT =.*$|FREETYPE_ROOT = ${libinclude freetype}|g ;
s|^JPEG_ROOT =.*$|JPEG_ROOT = ${libinclude libjpeg}|g ;
s|^JPEG2K_ROOT =.*$|JPEG2K_ROOT = ${libinclude openjpeg}|g ;
s|^IMAGEQUANT_ROOT =.*$|IMAGEQUANT_ROOT = ${libinclude' libimagequant}|g ;
s|^ZLIB_ROOT =.*$|ZLIB_ROOT = ${libinclude zlib}|g ;
s|^LCMS_ROOT =.*$|LCMS_ROOT = ${libinclude lcms2}|g ;
s|^TIFF_ROOT =.*$|TIFF_ROOT = ${libinclude libtiff}|g ;
s|^TCL_ROOT=.*$|TCL_ROOT = ${libinclude' tcl}|g ;
s|self\.disable_platform_guessing = None|self.disable_platform_guessing = True|g ;'
export LDFLAGS="$LDFLAGS -L${libwebp}/lib"
export CFLAGS="$CFLAGS -I${libwebp}/include"
'' + lib.optionalString (lib.versionAtLeast version "7.1.0") ''
export LDFLAGS="$LDFLAGS -L${libxcb}/lib"
export CFLAGS="$CFLAGS -I${libxcb.dev}/include"
'' + lib.optionalString stdenv.isDarwin ''
# Remove impurities
substituteInPlace setup.py \
--replace '"/Library/Frameworks",' "" \
--replace '"/System/Library/Frameworks"' ""
'';
}

View file

@ -2,8 +2,8 @@
, buildPythonPackage , buildPythonPackage
, fetchPypi , fetchPypi
, setuptools , setuptools
, torch
, numpy , numpy
, torch
}: }:
buildPythonPackage rec { buildPythonPackage rec {

View file

@ -0,0 +1,35 @@
diff --git a/modules/shared_options.py b/modules/shared_options.py
index 00b273fa..9dd8e2ce 100644
--- a/modules/shared_options.py
+++ b/modules/shared_options.py
@@ -4,6 +4,8 @@ from modules import localization, ui_components, shared_items, shared, interroga
from modules.paths_internal import models_path, script_path, data_path, sd_configs_path, sd_default_config, sd_model_file, default_sd_model_file, extensions_dir, extensions_builtin_dir # noqa: F401
from modules.shared_cmd_options import cmd_opts
from modules.options import options_section, OptionInfo, OptionHTML
+from modules.paths_internal import data_path
+import os
options_templates = {}
hide_dirs = shared.hide_dirs
@@ -66,14 +68,14 @@ options_templates.update(options_section(('saving-images', "Saving images/grids"
options_templates.update(options_section(('saving-paths', "Paths for saving"), {
"outdir_samples": OptionInfo("", "Output directory for images; if empty, defaults to three directories below", component_args=hide_dirs),
- "outdir_txt2img_samples": OptionInfo("outputs/txt2img-images", 'Output directory for txt2img images', component_args=hide_dirs),
- "outdir_img2img_samples": OptionInfo("outputs/img2img-images", 'Output directory for img2img images', component_args=hide_dirs),
- "outdir_extras_samples": OptionInfo("outputs/extras-images", 'Output directory for images from extras tab', component_args=hide_dirs),
+ "outdir_txt2img_samples": OptionInfo(os.path.join(data_path,"outputs/txt2img-images"), 'Output directory for txt2img images', component_args=hide_dirs),
+ "outdir_img2img_samples": OptionInfo(os.path.join(data_path,"outputs/img2img-images"), 'Output directory for img2img images', component_args=hide_dirs),
+ "outdir_extras_samples": OptionInfo(os.path.join(data_path,"outputs/extras-images"), 'Output directory for images from extras tab', component_args=hide_dirs),
"outdir_grids": OptionInfo("", "Output directory for grids; if empty, defaults to two directories below", component_args=hide_dirs),
- "outdir_txt2img_grids": OptionInfo("outputs/txt2img-grids", 'Output directory for txt2img grids', component_args=hide_dirs),
- "outdir_img2img_grids": OptionInfo("outputs/img2img-grids", 'Output directory for img2img grids', component_args=hide_dirs),
- "outdir_save": OptionInfo("log/images", "Directory for saving images using the Save button", component_args=hide_dirs),
- "outdir_init_images": OptionInfo("outputs/init-images", "Directory for saving init images when using img2img", component_args=hide_dirs),
+ "outdir_txt2img_grids": OptionInfo(os.path.join(data_path,"outputs/txt2img-grids"), 'Output directory for txt2img grids', component_args=hide_dirs),
+ "outdir_img2img_grids": OptionInfo(os.path.join(data_path,"outputs/img2img-grids"), 'Output directory for img2img grids', component_args=hide_dirs),
+ "outdir_save": OptionInfo(os.path.join(data_path,"log/images"), "Directory for saving images using the Save button", component_args=hide_dirs),
+ "outdir_init_images": OptionInfo(os.path.join(data_path,"outputs/init-images"), "Directory for saving init images when using img2img", component_args=hide_dirs),
}))
options_templates.update(options_section(('saving-to-dirs', "Saving to a directory"), {

View file

@ -6,107 +6,95 @@ let
in in
{ {
perSystem = { config, pkgs, ... }: let perSystem = { config, pkgs, system, ... }:
commonOverlays = [ let
overlays.python-fixPackages commonOverlays = [
(l.overlays.callManyPackages [ #need pillow < 10.0.0 for scripts like x,y,z plot to work
#cant i do like only for this for invoke other version?
../../packages/discord-webhook (
../../packages/deforum final: prev: {
../../packages/ultralytics pillow = pkgs.python3.pkgs.callPackage ../../packages/pillow { };
../../packages/rich pythonPackagesExtensions = prev.pythonPackagesExtensions ++ [
../../packages/k_diffusion (
../../packages/openclip python-final: python-prev: {
../../packages/safetensors pillow = python-final.callPackage ../../packages/pillow { };
../../packages/easing-functions }
../../packages/dynamicprompts )
../../packages/controlnet-aux ];
../../packages/fastapi }
../../packages/fastapi-events )
../../packages/fastapi-socketio overlays.python-fixPackages
../../packages/pytorch-lightning (l.overlays.callManyPackages [
../../packages/starlette ../../packages/analytics-python
../../packages/compel ../../packages/basicsr
../../packages/taming-transformers-rom1504 ../../packages/blendmodes
../../packages/albumentations ../../packages/blip
../../packages/qudida ../../packages/codeformer
../../packages/gfpgan ../../packages/facexlib
../../packages/basicsr ../../packages/gfpgan
../../packages/facexlib ../../packages/gradio
../../packages/realesrgan ../../packages/gradio-client
../../packages/codeformer ../../packages/k_diffusion
../../packages/clipseg ../../packages/lpips
../../packages/kornia ../../packages/openclip
../../packages/picklescan ../../packages/pillow
../../packages/diffusers ../../packages/pytorch-lightning
../../packages/pypatchmatch ../../packages/realesrgan
../../packages/torch-fidelity ../../packages/taming-transformers-rom1504
../../packages/resize-right ../../packages/tomesd
../../packages/torchdiffeq ../../packages/torch-fidelity
../../packages/accelerate ../../packages/torch-grammar
../../packages/clip-anytorch ../../packages/xformers
../../packages/clean-fid ])
../../packages/getpass-asterisk (final: prev: lib.mapAttrs
../../packages/mediapipe (_: pkg: pkg.overrideAttrs (old: {
../../packages/python-engineio nativeBuildInputs = old.nativeBuildInputs ++ [ final.pythonRelaxDepsHook ];
../../packages/lpips pythonRemoveDeps = [ "opencv-python-headless" "opencv-python" "tb-nightly" "clip" ];
../../packages/blip }
../../packages/gradio ))
../../packages/gradio-client {
../../packages/analytics-python inherit (prev)
../../packages/tomesd gfpgan
../../packages/blendmodes basicsr
../../packages/xformers facexlib
../../packages/zipunicode realesrgan
]) ;
(final: prev: lib.mapAttrs }
(_: pkg: pkg.overrideAttrs (old: { )
nativeBuildInputs = old.nativeBuildInputs ++ [ final.pythonRelaxDepsHook ]; ];
pythonRemoveDeps = [ "opencv-python-headless" "opencv-python" "tb-nightly" "clip" ];
}))
{
inherit (prev)
albumentations
qudida
gfpgan
basicsr
facexlib
realesrgan
clipseg
;
}
)
];
python3Variants = { python3Variants = {
nvidia = l.overlays.applyOverlays pkgs.python3Packages (commonOverlays ++ [ nvidia = l.overlays.applyOverlays pkgs.python3Packages (commonOverlays ++ [
overlays.python-torchCuda overlays.python-torchCuda
]); ]);
}; };
src = inputs.a1111-src; src = inputs.a1111-src;
mkAutomatic1111Variant = args: pkgs.callPackage ./package.nix ({ inherit src; sd-src = inputs.sd-src; sgm-src = inputs.sgm-src; } // args); mkAutomatic1111Variant = args: pkgs.callPackage ./package.nix ({ inherit src; sd-src = inputs.sd-src; sgm-src = inputs.sgm-src; } // args);
in { in
packages = { {
a1111-nvidia = mkAutomatic1111Variant { packages = {
python3Packages = python3Variants.nvidia; a1111-nvidia = mkAutomatic1111Variant {
python3Packages = python3Variants.nvidia;
};
}; };
}; };
};
flake.nixosModules = let flake.nixosModules =
packageModule = pkgAttrName: { pkgs, ... }: { let
services.a1111.package = withSystem pkgs.system ( packageModule = pkgAttrName: { pkgs, ... }: {
{ config, ... }: lib.mkOptionDefault config.packages.${pkgAttrName} services.a1111.package = withSystem pkgs.system (
); { config, ... }: lib.mkOptionDefault config.packages.${pkgAttrName}
);
};
in
{
a1111 = ./nixos;
invokeai-nvidia = {
imports = [
config.flake.nixosModules.invokeai
(packageModule "a1111-nvidia")
];
};
}; };
in {
a1111 = ./nixos;
invokeai-nvidia = {
imports = [
config.flake.nixosModules.invokeai
(packageModule "a1111-nvidia")
];
};
};
} }

View file

@ -0,0 +1,131 @@
{ config, lib, ... }:
let
inherit (lib)
mkIf mkOption mkEnableOption mkRenamedOptionModule types
escapeShellArgs flatten getExe mapAttrsToList
isBool isFloat isInt isList isString
floatToString optionalString
;
cfg = config.services.invokeai;
in
{
imports = map ({ old, new ? old }: mkRenamedOptionModule [ "services" "invokeai" old ] [ "services" "invokeai" "settings" new ]) [
{ old = "host"; }
{ old = "port"; }
{ old = "dataDir"; new = "root"; }
{ old = "precision"; }
];
options.services.invokeai = {
enable = mkEnableOption "InvokeAI Web UI for Stable Diffusion";
package = mkOption {
description = "Which InvokeAI package to use.";
type = types.package;
};
user = mkOption {
description = "Which user to run InvokeAI as.";
default = "invokeai";
type = types.str;
};
group = mkOption {
description = "Which group to run InvokeAI as.";
default = "invokeai";
type = types.str;
};
settings = mkOption {
description = "Structured command line arguments.";
default = { };
type = types.submodule {
freeformType = with types; let
atom = nullOr (oneOf [
bool
str
int
float
]);
in attrsOf (either atom (listOf atom));
options = {
host = mkOption {
description = "Which IP address to listen on.";
default = "127.0.0.1";
type = types.str;
};
port = mkOption {
description = "Which port to listen on.";
default = 9090;
type = types.port;
};
root = mkOption {
description = "Where to store InvokeAI's state.";
default = "/var/lib/invokeai";
type = types.path;
};
precision = mkOption {
description = "Set model precision.";
default = "auto";
type = types.enum [ "auto" "float32" "autocast" "float16" ];
};
};
};
};
extraArgs = mkOption {
description = "Additional raw command line arguments.";
default = [];
type = with types; listOf str;
};
};
config = let
cliArgs = (flatten (mapAttrsToList (n: v:
if v == null then []
else if isBool v then [ "--${optionalString (!v) "no-"}${n}" ]
else if isInt v then [ "--${n}" "${toString v}" ]
else if isFloat v then [ "--${n}" "${floatToString v}" ]
else if isString v then ["--${n}" v ]
else if isList v then [ "--${n}" (toString v) ]
else throw "Unhandled type for setting \"${n}\""
) cfg.settings)) ++ cfg.extraArgs;
in mkIf cfg.enable {
users.users = mkIf (cfg.user == "invokeai") {
invokeai = {
isSystemUser = true;
inherit (cfg) group;
};
};
users.groups = mkIf (cfg.group == "invokeai") {
invokeai = {};
};
systemd.services.invokeai = {
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
environment = {
HOME = "${cfg.settings.root}/.home";
INVOKEAI_ROOT = "${cfg.settings.root}";
NIXIFIED_AI_NONINTERACTIVE = "1";
};
serviceConfig = {
User = cfg.user;
Group = cfg.group;
ExecStart = "${getExe cfg.package} ${escapeShellArgs cliArgs}";
PrivateTmp = true;
};
};
systemd.tmpfiles.rules = [
"d '${cfg.settings.root}' 0755 ${cfg.user} ${cfg.group} - -"
"d '${cfg.settings.root}/configs' 0755 ${cfg.user} ${cfg.group} - -"
"d '${cfg.settings.root}/.home' 0750 ${cfg.user} ${cfg.group} - -"
];
};
}

View file

@ -1,183 +1,114 @@
{ python3Packages, { python3Packages
sd-src, , sd-src
sgm-src, , sgm-src
# misc , # misc
lib lib
, src , src
# extra deps # extra deps
}: }:
let
submodel = pkg: python3Packages.${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
python3Packages.buildPythonPackage { python3Packages.buildPythonPackage {
pname = "Automatic1111"; pname = "Automatic1111";
format = "other"; format = "other";
version = "v1.6.0"; version = "v1.6.0";
inherit src; inherit src;
propagatedBuildInputs = with python3Packages; [ propagatedBuildInputs = with python3Packages; [
moviepy #for prompt travel aiofiles
zipunicode #for civitaui browser+ analytics-python
imageio #animatediff create webm and shit altair
av #animatediff create webm and shit blendmodes
discord-webhook #for dreambooth i think codeformer
numexpr #for some extension einops
deforum #for some extension facexlib
ultralytics #extension gfpgan
k_diffusion gradio
inflection gradio-client
gdown inflection
altair k-diffusion
aiofiles kornia
openclip lark
semver openclip
numpy omegaconf
rich #extension piexif
torchsde pytorch-lightning
uvicorn realesrgan
pyperclip safetensors
invisible-watermark semantic-version
fastapi taming-transformers-rom1504
fastapi-events timm
fastapi-socketio tomesd
timm torch
scikit-image transformers
controlnet-aux xformers
compel ];
python-dotenv
uvloop
watchfiles
httptools
websockets
dnspython
albumentations
opencv4
pudb
imageio
imageio-ffmpeg
compel
npyscreen
pytorch-lightning
protobuf
omegaconf
test-tube
einops
taming-transformers-rom1504
torch-fidelity
torchmetrics
transformers
kornia
k-diffusion
picklescan
diffusers
pypatchmatch
realesrgan
pillow
send2trash
flask
flask-cors
dependency-injector
gfpgan
eventlet
clipseg
getpass-asterisk
safetensors
datasets
accelerate
easing-functions
dynamicprompts
torchvision
test-tube
lark
gradio
gradio-client
tomesd
piexif
blendmodes
xformers
python-multipart
];
nativeBuildInputs = with python3Packages; [ pythonRelaxDepsHook pip ];
pythonRemoveDeps = [ "clip" "pyreadline3" "flaskwebgui" "opencv-python" ];
pythonRelaxDeps = [ "dnspython" "flask" "requests" "numpy" "pytorch-lightning" "torchsde" "uvicorn" "invisible-watermark" "accelerate" "scikit-image" "safetensors" "torchvision" "test-tube" "fastapi" ];
dontUsePytestCheck = true; patches = [ ./_outputpaths.patch ];
doCheck = false; buildPhase =
''
runHook preBuild
mkdir -p dist
cp -r . $out
chmod -R +w $out
cd $out
buildPhase = '' sed -i '28,43d' launch.py
runHook preBuild
mkdir -p dist
cp -r . $out
chmod -R +w $out
cd $out
#replace dirs in paths_internal.py
#mkdir -p /var/lib/.webui
sed -i 's#os\.path\.join(script_path, "config_states")#os\.path\.join(data_path, "config_states")#' ./modules/paths_internal.py
#delete lines trying to pull git repos and setting up tests in launch.py
sed -i '28,43d' launch.py
#firstly, we need to make launch.py runnable by adding python shebang substituteInPlace ./modules/paths_internal.py \
cat <<-EOF > exec_launch.py.unwrapped --replace 'os.path.join(script_path, "config_states")' \
$(echo "#!/usr/bin/python") 'os.path.join(data_path, "config_states")'
$(cat launch.py)
EOF substituteInPlace ./modules/shared_gradio_themes.py \
chmod +x exec_launch.py.unwrapped --replace script_path data_path
#creating wrapper around launch.py with PYTHONPATH correctly set #make launch.py executable > shebang
makeWrapper "$(pwd)/exec_launch.py.unwrapped" exec_launch.py \ mkdir -p $out/bin
--set-default PYTHONPATH $PYTHONPATH cat <<-EOF > launch.py
$(echo "#!/usr/bin/python")
$(cat launch.py)
EOF
chmod +x launch.py
makeWrapper "$out/launch.py" $out/bin/launch-wrapped.py \
--run 'export COMMANDLINE_ARGS="''${COMMANDLINE_ARGS:-\
--data-dir $HOME/.webui --skip-install \
--theme dark --ckpt-dir $HOME/.webui/models/ckpt \
--embeddings-dir $HOME/.webui/models/embeddings \
--medvram --no-half-vae}"' \
--set-default PYTHONPATH $PYTHONPATH \
--chdir $out
mkdir $out/bin rm -rf dist
pushd $out/bin
ln -s ../exec_launch.py launch.py
buck='$' #escaping $ inside shell inside shell is tricky
#next is an additional shell wrapper, which sets sensible default args for CLI
#additional arguments will be passed further
cat <<-EOF > flake-launch
#!/usr/bin/env bash
pushd $out #For some reason, fastapi only works when current workdir is set inside the repo
trap "popd" EXIT
"$out/bin/launch.py" --skip-install "$buck{@}" runHook postBuild
EOF '';
# below lie remnants of my attempt to make webui use similar paths as InvokeAI for models download
# additions of such options in upstream is a welcome sign, however they're mostly ignored and therefore useless
# TODO: check in 6 months, maybe it'll work
# For now, your best bet is to use ZFS dataset with dedup enabled or make symlinks after the fact
#--codeformer-models-path "\$mp/codeformer" \
#--gfpgan-models-path "\$mp/gfpgan" --esrgan-models-path "\$mp/esrgan" \
#--bsrgan-models-path "\$mp/bsrgan" --realesrgan-models-path "\$mp/realesrgan" \
#--clip-models-path "\$mp/clip"
chmod +x flake-launch
popd
runHook postBuild installPhase =
''; let
installPhase = '' submodel = pkg: python3Packages.${pkg} + "/lib/python3.10/site-packages";
runHook preInstall taming-transformers = submodel "taming-transformers-rom1504";
k_diffusion = submodel "k_diffusion";
codeformer = (submodel "codeformer") + "/codeformer";
blip = (submodel "blip") + "/blip";
in
''
runHook preInstall
rm -rf repositories/ rm -rf repositories/
mkdir repositories mkdir repositories
pushd repositories pushd repositories
ln -s ${sd-src}/ stable-diffusion-stability-ai ln -s ${sd-src}/ stable-diffusion-stability-ai
ln -s ${sgm-src}/ generative-models ln -s ${sgm-src}/ generative-models
ln -s ${taming-transformers}/ taming-transformers ln -s ${taming-transformers}/ taming-transformers
ln -s ${k_diffusion}/ k-diffusion ln -s ${k_diffusion}/ k-diffusion
ln -s ${codeformer}/ CodeFormer ln -s ${codeformer}/ CodeFormer
ln -s ${blip}/ BLIP ln -s ${blip}/ BLIP
popd popd
echo $PATH
runHook postInstall runHook postInstall
''; '';
meta = { meta = {
description = "Fancy Web UI for Stable Diffusion"; description = "Fancy Web UI for Stable Diffusion";
homepage = "https://github.com/AUTOMATIC1111/stable-diffusion-webui"; homepage = "https://github.com/AUTOMATIC1111/stable-diffusion-webui";
mainProgram = "flake-launch"; mainProgram = "launch-wrapped.py";
}; };
} }

View file

@ -1,44 +1,51 @@
{ config, inputs, lib, withSystem, ... }: { config, inputs, lib, withSystem, ... }:
let
l = lib // config.flake.lib;
inherit (config.flake) overlays;
in
{ {
perSystem = { config, pkgs, ... }: perSystem = { config, pkgs, ... }: let
let commonOverlays = [
src = inputs.bark-gui-src; overlays.python-fixPackages
overlays = [ (l.overlays.callManyPackages [
( ../../packages/audiolm-pytorch
final: prev: { ../../packages/ema-pytorch
final.python310 = prev.python310.override { ../../packages/local-attention
enableOptimizations = true; ../../packages/pytorch-seed
reproducibleBuild = false; ../../packages/vector-quantize-pytorch
self = final.python310; ])
buildInputs = [ final.ffmpeg-full ]; ];
};
pythonPackagesExtensions = prev.pythonPackagesExtensions ++ [
(
python-final: python-prev: {
pytorch-seed = python-final.callPackage ../../Packages/pytorch-seed { };
audiolm-pytorch = python-final.callPackage ../../Packages/audiolm-pytorch { };
vector-quantize-pytorch = python-final.callPackage ../../Packages/vector-quantize-pytorch { };
local-attention = python-final.callPackage ../../Packages/local-attention { };
ema-pytorch = python-final.callPackage ../../Packages/ema-pytorch { };
openai-triton = python-prev.openai-triton-bin; python3Variants = {
torch = python-prev.torch-bin; nvidia = l.overlays.applyOverlays pkgs.python3Packages (commonOverlays ++ [
torchaudio = python-prev.torchaudio-bin; overlays.python-torchCuda
]);
};
#bark-gui = python-final.callPackage ../../Packages/bark-gui.nix { }; src = inputs.bark-gui-src;
} mkbark-guiVariant = args: pkgs.callPackage ./package.nix ({ inherit src; } // args);
) in {
]; packages = {
} bark-gui-nvidia = mkbark-guiVariant {
) python3Packages = python3Variants.nvidia;
];
mkbark-guiVariant = args: pkgs.callPackage ./package.nix ({ inherit src; } // args);
in
{
packages = {
bark-gui = mkbark-guiVariant {
inherit overlays;
};
}; };
}; };
};
flake.nixosModules = let
packageModule = pkgAttrName: { pkgs, ... }: {
services.a1111.package = withSystem pkgs.system (
{ config, ... }: lib.mkOptionDefault config.packages.${pkgAttrName}
);
};
in {
bark-gui = ./nixos;
invokeai-nvidia = {
imports = [
config.flake.nixosModules.invokeai
(packageModule "bark-gui-nvidia")
];
};
};
} }

View file

@ -1,77 +1,63 @@
{ lib { python3Packages
, buildPythonPackage , # misc
, fetchFromGitHub lib
, writeShellScript
, setuptools
# dependencies
, fairseq
, audiolm-pytorch
, gradio
, funcy
, linkify-it-py
, mutagen
, pytorch-seed
, pyyaml
, sentencepiece
, transformers
, ffmpeg-full
, src , src
# extra deps
}: }:
python3Packages.buildPythonPackage {
buildPythonPackage rec {
pname = "bark-gui"; pname = "bark-gui";
format = "pyproject"; format = "setuptools";
version = "0.7.1"; version = "07.1";
inherit src;
propagatedBuildInputs = [ propagatedBuildInputs = with python3Packages; [
fairseq
audiolm-pytorch audiolm-pytorch
gradio boto3
ema-pytorch
encodec
funcy funcy
linkify-it-py gradio
mutagen local-attention
pytorch-seed pytorch-seed
pyyaml safetensors
sentencepiece scipy
torch-bin
torchaudio-bin
transformers transformers
vector-quantize-pytorch
]; ];
buildInputs = [ #nativeBuildInputs = with python3Packages; [ pythonRelaxDepsHook pip ];
setuptools nativeBuildInputs = with python3Packages; [ setuptools pip ];
ffmpeg-full #pythonRemoveDeps = [ "clip" "pyreadline3" "flaskwebgui" "opencv-python" ];
pythonRelaxDeps = [ "dnspython" "flask" "requests" "numpy" "pytorch-lightning" "torchsde" "uvicorn" "invisible-watermark" "accelerate" "scikit-image" "safetensors" "torchvision" "test-tube" "fastapi" ];
makeWrapperArgs = [
'' --set-default PYTHONPATH=$PYTHONPATH ''
]; ];
dontWrapPythonPrograms = true; buildPhase = ''
postFixup = mkdir -p dist
let runHook preBuild
setupScript = writeShellScript "bark-gui" '' cp -r . $out
if [[ ! -d $HOME/.bark-gui ]]; then chmod -R +w $out
mkdir -p $HOME cd $out
cp -r ${src} $HOME/.bark-gui
chmod 0755 $HOME/.bark-gui chmod +x webui.py
chmod 0644 $HOME/.bark-gui/config.yaml #add shbang to webui.py
mkdir -p $HOME/.bark-gui/training/data/output cat <<-EOF > webui.py
mkdir -p $HOME/.bark-gui/training/inputtext $(echo "#!/usr/bin/python")
chmod 755 $HOME/.bark-gui/training/data/output $HOME/.bark-gui/training/inputtext $HOME/.bark-gui/bark/assets/prompts/custom/ $(cat webui.py)
fi EOF
pushd "$PWD"
cd $HOME/.bark-gui/ mkdir -p $out/bin
MYOLDPATH="$PATH" ln -s webui-wrapped.py $out/bin/bark-gui
export PATH="$PATH:${ffmpeg-full.bin}/bin/" makeWrapper "$(pwd)/webui.py" "$out/bin/bark-gui" --set-default PYTHONPATH=$PYTHONPATH
python webui.py "$@" chmod +x $out/bin/bark-gui
export PATH="$MYOLDPATH"
popd runHook postBuild
''; '';
in
''
mkdir -p $out/bin
ln -s ${setupScript} $out/bin/bark-gui
'';
meta = { meta = {
description = "A Gradio Web UI for an extended - easy to use - Bark Version"; description = "A Gradio Web UI for an extended - easy to use - Bark Version.";
homepage = "https://github.com/C0untFloyd/bark-gui"; homepage = "https://github.com/C0untFloyd/bark-gui";
mainProgram = "bark-gui"; mainProgram = "bark-gui";
}; };

View file

@ -84,11 +84,10 @@ in
src = inputs.kohya_ss-src; src = inputs.kohya_ss-src;
mkkohya_ssVariant = args: pkgs.callPackage ./package.nix ({ inherit src; } // args); mkkohya_ssVariant = args: python3Variants.nvidia.callPackage ./package.nix ({ inherit src; } // args);
in { in {
packages = { packages = {
kohya_ss-nvidia = mkkohya_ssVariant { kohya_ss-nvidia = mkkohya_ssVariant {
python3Packages = python3Variants.nvidia;
}; };
}; };
legacyPackages = { legacyPackages = {

View file

@ -1,114 +1,190 @@
{ python3Packages { lib
, lib , pythonRelaxDepsHook
, src , pip
, src
, deforum
, inflection
, gdown
, altair
, aiofiles
, openclip
, semver
, numpy
, torchsde
, uvicorn
, pyperclip
, invisible-watermark
, fastapi
, fastapi-events
, fastapi-socketio
, timm
, scikit-image
, controlnet-aux
, compel
, python-dotenv
, uvloop
, watchfiles
, httptools
, websockets
, dnspython
, albumentations
, opencv4
, pudb
, imageio
, imageio-ffmpeg
, npyscreen
, pytorch-lightning
, protobuf
, omegaconf
, test-tube
, einops
, taming-transformers-rom1504
, torch-fidelity
, torchmetrics
, transformers
, kornia
, k-diffusion
, picklescan
, diffusers
, pypatchmatch
, realesrgan
, pillow
, send2trash
, flask
, flask-cors
, dependency-injector
, gfpgan
, eventlet
, clipseg
, getpass-asterisk
, safetensors
, datasets
, accelerate
, easing-functions
, dynamicprompts
, torchvision
, lark
, gradio
, gradio-client
, tomesd
, piexif
, blendmodes
, poetry-core
, xformers
, python-multipart
, buildPythonPackage
, easygui
, rich
}: }:
python3Packages.buildPythonPackage { buildPythonPackage {
pname = "kohya_ss"; pname = "kohya_ss";
format = "other"; format = "pyproject";
version = "v22.1.1"; version = "v22.1.1";
inherit src; inherit src;
propagatedBuildInputs = with python3Packages; [ propagatedBuildInputs = [
deforum deforum
inflection rich
gdown inflection
altair gdown
aiofiles altair
openclip aiofiles
semver openclip
numpy semver
torchsde numpy
uvicorn torchsde
pyperclip uvicorn
invisible-watermark pyperclip
fastapi invisible-watermark
fastapi-events fastapi
fastapi-socketio fastapi-events
timm fastapi-socketio
scikit-image timm
controlnet-aux scikit-image
compel controlnet-aux
python-dotenv compel
uvloop python-dotenv
watchfiles uvloop
httptools watchfiles
websockets httptools
dnspython websockets
albumentations dnspython
opencv4 albumentations
pudb opencv4
imageio pudb
imageio-ffmpeg imageio
compel imageio-ffmpeg
npyscreen compel
pytorch-lightning npyscreen
protobuf pytorch-lightning
omegaconf protobuf
test-tube omegaconf
einops test-tube
taming-transformers-rom1504 einops
torch-fidelity taming-transformers-rom1504
torchmetrics torch-fidelity
transformers torchmetrics
kornia transformers
k-diffusion kornia
picklescan k-diffusion
diffusers picklescan
pypatchmatch diffusers
realesrgan pypatchmatch
pillow realesrgan
send2trash pillow
flask send2trash
flask-cors flask
dependency-injector flask-cors
gfpgan dependency-injector
eventlet gfpgan
clipseg eventlet
getpass-asterisk clipseg
safetensors getpass-asterisk
datasets safetensors
accelerate datasets
easing-functions accelerate
dynamicprompts easing-functions
torchvision dynamicprompts
test-tube torchvision
lark test-tube
gradio lark
gradio-client gradio
tomesd gradio-client
piexif tomesd
blendmodes piexif
xformers blendmodes
python-multipart poetry-core
]; xformers
nativeBuildInputs = with python3Packages; [ pythonRelaxDepsHook pip ]; python-multipart
easygui
];
nativeBuildInputs = [ pythonRelaxDepsHook pip ];
pythonRemoveDeps = [ "clip" "pyreadline3" "flaskwebgui" "opencv-python" ]; pythonRemoveDeps = [ "clip" "pyreadline3" "flaskwebgui" "opencv-python" ];
pythonRelaxDeps = [ "dnspython" "flask" "requests" "numpy" "pytorch-lightning" "torchsde" "uvicorn" "invisible-watermark" "accelerate" "scikit-image" "safetensors" "torchvision" "test-tube" "fastapi" ]; pythonRelaxDeps = [ "dnspython" "flask" "requests" "numpy" "pytorch-lightning" "torchsde" "uvicorn" "invisible-watermark" "accelerate" "scikit-image" "safetensors" "torchvision" "test-tube" "fastapi" ];
dontUsePytestCheck = true;
doCheck = false; doCheck = false;
dontUsePytestCheck = true;
buildPhase = '' buildPhase = ''
runHook preBuild runHook preBuild
mkdir -p dist mkdir -p dist
cp -r . $out mkdir -p $out
chmod -R +w $out cp -r . $out
cd $out cd $out
--run setup.sh mkdir -p $out/bin
mkdir -p $out/bin sed -i "2i echo $OSTYPE" $out/setup.sh
mv gui.sh $out/bin/gui.sh chmod +x kohya_gui.py
sed -i '10d' $out/library/localization.py
sed -i "10i\ \ \ \ dirname = '$out/localizations'" $out/library/localization.py
sed -i "1i #!/bin/python" $out/kohya_gui.py
echo "$(python --version)"
makeWrapper $out/kohya_gui.py $out/bin/gui_wrapped.py --set-default PYTHONPATH $PYTHONPATH
chmod +x $out/bin/gui_wrapped.py
runHook postBuild runHook postBuild
''; '';
installPhase = ''
runHook preInstall
runHook postInstall
'';
meta = { meta = {
description = "GUI for Kohya's Stable Diffusion trainers"; description = "GUI for Kohya's Stable Diffusion trainers";
homepage = "https://github.com/bmaltais/kohya_ss.git"; homepage = "https://github.com/bmaltais/kohya_ss.git";
mainProgram = "gui.sh"; mainProgram = "gui_wrapped.py";
}; };
} }

1
setup.log Normal file
View file

@ -0,0 +1 @@
2023-11-23 20:07:53,586 | INFO | /nix/store/6ccgy8vmpimlwx8cjqgrpwgpfdg0m3id-python3.10-kohya_ss-v22.1.1/kohya_gui.py | headless: False