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"
}
},
"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": {
"locked": {
"lastModified": 1697059129,
@ -240,6 +256,7 @@
"invokeai-src": "invokeai-src",
"kohya_ss-src": "kohya_ss-src",
"nixpkgs": "nixpkgs_2",
"nixpkgs-stable": "nixpkgs-stable",
"sd-src": "sd-src",
"sgm-src": "sgm-src",
"textgen-src": "textgen-src"

View file

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

View file

@ -1,51 +1,57 @@
lib: {
fixPackages = final: prev: let
relaxProtobuf = pkg: pkg.overrideAttrs (old: {
nativeBuildInputs = old.nativeBuildInputs ++ [ final.pythonRelaxDepsHook ];
pythonRelaxDeps = [ "protobuf" ];
});
in {
invisible-watermark = prev.invisible-watermark.overridePythonAttrs {
pythonImportsCheck = [ ];
};
torchsde = prev.torchsde.overridePythonAttrs { doCheck = false;
pythonImportsCheck = []; };
pytorch-lightning = relaxProtobuf prev.pytorch-lightning;
wandb = relaxProtobuf (prev.wandb.overridePythonAttrs {
doCheck = false;
});
anyio = prev.anyio.overridePythonAttrs { doCheck = false; dontUsePytestCheck = true;};
mocket = prev.mocket.overridePythonAttrs { doCheck = false; dontUsePytestCheck = true;};
markdown-it-py = prev.markdown-it-py.overrideAttrs (old: {
nativeBuildInputs = old.nativeBuildInputs ++ [ final.pythonRelaxDepsHook ];
pythonRelaxDeps = [ "linkify-it-py" ];
passthru = old.passthru // {
optional-dependencies = with final; {
linkify = [ linkify-it-py ];
plugins = [ mdit-py-plugins ];
fixPackages = final: prev:
let
relaxProtobuf = pkg: pkg.overrideAttrs (old: {
nativeBuildInputs = old.nativeBuildInputs ++ [ final.pythonRelaxDepsHook ];
pythonRelaxDeps = [ "protobuf" ];
});
in
{
invisible-watermark = prev.invisible-watermark.overridePythonAttrs {
pythonImportsCheck = [ ];
};
torchsde = prev.torchsde.overridePythonAttrs {
doCheck = false;
pythonImportsCheck = [ ];
};
pytorch-lightning = relaxProtobuf prev.pytorch-lightning;
wandb = relaxProtobuf (prev.wandb.overridePythonAttrs {
doCheck = false;
});
anyio = prev.anyio.overridePythonAttrs { doCheck = false; dontUsePytestCheck = true; };
mocket = prev.mocket.overridePythonAttrs { doCheck = false; dontUsePytestCheck = true; };
markdown-it-py = prev.markdown-it-py.overrideAttrs (old: {
nativeBuildInputs = old.nativeBuildInputs ++ [ final.pythonRelaxDepsHook ];
pythonRelaxDeps = [ "linkify-it-py" ];
passthru = old.passthru // {
optional-dependencies = with final; {
linkify = [ linkify-it-py ];
plugins = [ mdit-py-plugins ];
};
};
};
});
filterpy = prev.filterpy.overrideAttrs (old: {
doInstallCheck = false;
});
shap = prev.shap.overrideAttrs (old: {
doInstallCheck = false;
propagatedBuildInputs = old.propagatedBuildInputs ++ [ final.packaging ];
pythonImportsCheck = [ "shap" ];
});
filterpy = prev.filterpy.overrideAttrs (old: {
doInstallCheck = false;
});
shap = prev.shap.overrideAttrs (old: {
doInstallCheck = false;
propagatedBuildInputs = old.propagatedBuildInputs ++ [ final.packaging ];
pythonImportsCheck = [ "shap" ];
meta = old.meta // {
broken = false;
};
});
streamlit = let
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;
opencv-python = final.opencv4;
};
meta = old.meta // {
broken = false;
};
});
streamlit =
let
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;
opencv-python = final.opencv4;
};
torchRocm = final: prev: {
torch = prev.torch.override {
@ -54,7 +60,7 @@ lib: {
rocmSupport = true;
};
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
, fetchPypi
, setuptools
, torch
, numpy
, torch
}:
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
{
perSystem = { config, pkgs, ... }: let
commonOverlays = [
overlays.python-fixPackages
(l.overlays.callManyPackages [
perSystem = { config, pkgs, system, ... }:
let
commonOverlays = [
#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?
(
final: prev: {
pillow = pkgs.python3.pkgs.callPackage ../../packages/pillow { };
pythonPackagesExtensions = prev.pythonPackagesExtensions ++ [
(
python-final: python-prev: {
pillow = python-final.callPackage ../../packages/pillow { };
}
)
];
}
)
overlays.python-fixPackages
(l.overlays.callManyPackages [
../../packages/analytics-python
../../packages/basicsr
../../packages/blendmodes
../../packages/blip
../../packages/codeformer
../../packages/facexlib
../../packages/gfpgan
../../packages/gradio
../../packages/gradio-client
../../packages/k_diffusion
../../packages/lpips
../../packages/openclip
../../packages/pillow
../../packages/pytorch-lightning
../../packages/realesrgan
../../packages/taming-transformers-rom1504
../../packages/tomesd
../../packages/torch-fidelity
../../packages/torch-grammar
../../packages/xformers
])
(final: prev: lib.mapAttrs
(_: pkg: pkg.overrideAttrs (old: {
nativeBuildInputs = old.nativeBuildInputs ++ [ final.pythonRelaxDepsHook ];
pythonRemoveDeps = [ "opencv-python-headless" "opencv-python" "tb-nightly" "clip" ];
}
))
{
inherit (prev)
gfpgan
basicsr
facexlib
realesrgan
;
}
)
];
../../packages/discord-webhook
../../packages/deforum
../../packages/ultralytics
../../packages/rich
../../packages/k_diffusion
../../packages/openclip
../../packages/safetensors
../../packages/easing-functions
../../packages/dynamicprompts
../../packages/controlnet-aux
../../packages/fastapi
../../packages/fastapi-events
../../packages/fastapi-socketio
../../packages/pytorch-lightning
../../packages/starlette
../../packages/compel
../../packages/taming-transformers-rom1504
../../packages/albumentations
../../packages/qudida
../../packages/gfpgan
../../packages/basicsr
../../packages/facexlib
../../packages/realesrgan
../../packages/codeformer
../../packages/clipseg
../../packages/kornia
../../packages/picklescan
../../packages/diffusers
../../packages/pypatchmatch
../../packages/torch-fidelity
../../packages/resize-right
../../packages/torchdiffeq
../../packages/accelerate
../../packages/clip-anytorch
../../packages/clean-fid
../../packages/getpass-asterisk
../../packages/mediapipe
../../packages/python-engineio
../../packages/lpips
../../packages/blip
../../packages/gradio
../../packages/gradio-client
../../packages/analytics-python
../../packages/tomesd
../../packages/blendmodes
../../packages/xformers
../../packages/zipunicode
])
(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 = {
nvidia = l.overlays.applyOverlays pkgs.python3Packages (commonOverlays ++ [
overlays.python-torchCuda
]);
};
python3Variants = {
nvidia = l.overlays.applyOverlays pkgs.python3Packages (commonOverlays ++ [
overlays.python-torchCuda
]);
};
src = inputs.a1111-src;
mkAutomatic1111Variant = args: pkgs.callPackage ./package.nix ({ inherit src; sd-src = inputs.sd-src; sgm-src = inputs.sgm-src; } // args);
in {
packages = {
a1111-nvidia = mkAutomatic1111Variant {
python3Packages = python3Variants.nvidia;
src = inputs.a1111-src;
mkAutomatic1111Variant = args: pkgs.callPackage ./package.nix ({ inherit src; sd-src = inputs.sd-src; sgm-src = inputs.sgm-src; } // args);
in
{
packages = {
a1111-nvidia = mkAutomatic1111Variant {
python3Packages = python3Variants.nvidia;
};
};
};
};
flake.nixosModules = let
packageModule = pkgAttrName: { pkgs, ... }: {
services.a1111.package = withSystem pkgs.system (
{ config, ... }: lib.mkOptionDefault config.packages.${pkgAttrName}
);
flake.nixosModules =
let
packageModule = pkgAttrName: { pkgs, ... }: {
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,
sd-src,
sgm-src,
# misc
lib
, src
# extra deps
{ python3Packages
, sd-src
, sgm-src
, # misc
lib
, src
# 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 {
pname = "Automatic1111";
format = "other";
version = "v1.6.0";
inherit src;
propagatedBuildInputs = with python3Packages; [
moviepy #for prompt travel
zipunicode #for civitaui browser+
imageio #animatediff create webm and shit
av #animatediff create webm and shit
discord-webhook #for dreambooth i think
numexpr #for some extension
deforum #for some extension
ultralytics #extension
k_diffusion
inflection
gdown
altair
aiofiles
openclip
semver
numpy
rich #extension
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
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" ];
aiofiles
analytics-python
altair
blendmodes
codeformer
einops
facexlib
gfpgan
gradio
gradio-client
inflection
k-diffusion
kornia
lark
openclip
omegaconf
piexif
pytorch-lightning
realesrgan
safetensors
semantic-version
taming-transformers-rom1504
timm
tomesd
torch
transformers
xformers
];
dontUsePytestCheck = true;
patches = [ ./_outputpaths.patch ];
doCheck = false;
buildPhase =
''
runHook preBuild
buildPhase = ''
runHook preBuild
mkdir -p dist
cp -r . $out
chmod -R +w $out
cd $out
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
sed -i '28,43d' launch.py
#firstly, we need to make launch.py runnable by adding python shebang
cat <<-EOF > exec_launch.py.unwrapped
$(echo "#!/usr/bin/python")
$(cat launch.py)
EOF
chmod +x exec_launch.py.unwrapped
substituteInPlace ./modules/paths_internal.py \
--replace 'os.path.join(script_path, "config_states")' \
'os.path.join(data_path, "config_states")'
#creating wrapper around launch.py with PYTHONPATH correctly set
makeWrapper "$(pwd)/exec_launch.py.unwrapped" exec_launch.py \
--set-default PYTHONPATH $PYTHONPATH
substituteInPlace ./modules/shared_gradio_themes.py \
--replace script_path data_path
mkdir $out/bin
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
#make launch.py executable > shebang
mkdir -p $out/bin
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
"$out/bin/launch.py" --skip-install "$buck{@}"
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
rm -rf dist
#--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
'';
runHook postBuild
'';
installPhase = ''
runHook preInstall
installPhase =
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
''
runHook preInstall
rm -rf repositories/
mkdir repositories
pushd repositories
ln -s ${sd-src}/ stable-diffusion-stability-ai
ln -s ${sgm-src}/ generative-models
ln -s ${taming-transformers}/ taming-transformers
ln -s ${k_diffusion}/ k-diffusion
ln -s ${codeformer}/ CodeFormer
ln -s ${blip}/ BLIP
popd
echo $PATH
runHook postInstall
'';
rm -rf repositories/
mkdir repositories
pushd repositories
ln -s ${sd-src}/ stable-diffusion-stability-ai
ln -s ${sgm-src}/ generative-models
ln -s ${taming-transformers}/ taming-transformers
ln -s ${k_diffusion}/ k-diffusion
ln -s ${codeformer}/ CodeFormer
ln -s ${blip}/ BLIP
popd
runHook postInstall
'';
meta = {
description = "Fancy Web UI for Stable Diffusion";
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, ... }:
let
l = lib // config.flake.lib;
inherit (config.flake) overlays;
in
{
perSystem = { config, pkgs, ... }:
let
src = inputs.bark-gui-src;
overlays = [
(
final: prev: {
final.python310 = prev.python310.override {
enableOptimizations = true;
reproducibleBuild = false;
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 { };
perSystem = { config, pkgs, ... }: let
commonOverlays = [
overlays.python-fixPackages
(l.overlays.callManyPackages [
../../packages/audiolm-pytorch
../../packages/ema-pytorch
../../packages/local-attention
../../packages/pytorch-seed
../../packages/vector-quantize-pytorch
])
];
openai-triton = python-prev.openai-triton-bin;
torch = python-prev.torch-bin;
torchaudio = python-prev.torchaudio-bin;
python3Variants = {
nvidia = l.overlays.applyOverlays pkgs.python3Packages (commonOverlays ++ [
overlays.python-torchCuda
]);
};
#bark-gui = python-final.callPackage ../../Packages/bark-gui.nix { };
}
)
];
}
)
];
mkbark-guiVariant = args: pkgs.callPackage ./package.nix ({ inherit src; } // args);
in
{
packages = {
bark-gui = mkbark-guiVariant {
inherit overlays;
};
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;
};
};
};
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
, buildPythonPackage
, fetchFromGitHub
, writeShellScript
, setuptools
# dependencies
, fairseq
, audiolm-pytorch
, gradio
, funcy
, linkify-it-py
, mutagen
, pytorch-seed
, pyyaml
, sentencepiece
, transformers
, ffmpeg-full
{ python3Packages
, # misc
lib
, src
# extra deps
}:
buildPythonPackage rec {
python3Packages.buildPythonPackage {
pname = "bark-gui";
format = "pyproject";
version = "0.7.1";
propagatedBuildInputs = [
fairseq
format = "setuptools";
version = "07.1";
inherit src;
propagatedBuildInputs = with python3Packages; [
audiolm-pytorch
gradio
boto3
ema-pytorch
encodec
funcy
linkify-it-py
mutagen
gradio
local-attention
pytorch-seed
pyyaml
sentencepiece
safetensors
scipy
torch-bin
torchaudio-bin
transformers
vector-quantize-pytorch
];
buildInputs = [
setuptools
ffmpeg-full
#nativeBuildInputs = with python3Packages; [ pythonRelaxDepsHook pip ];
nativeBuildInputs = with python3Packages; [ setuptools 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" ];
makeWrapperArgs = [
'' --set-default PYTHONPATH=$PYTHONPATH ''
];
dontWrapPythonPrograms = true;
postFixup =
let
setupScript = writeShellScript "bark-gui" ''
if [[ ! -d $HOME/.bark-gui ]]; then
mkdir -p $HOME
cp -r ${src} $HOME/.bark-gui
chmod 0755 $HOME/.bark-gui
chmod 0644 $HOME/.bark-gui/config.yaml
mkdir -p $HOME/.bark-gui/training/data/output
mkdir -p $HOME/.bark-gui/training/inputtext
chmod 755 $HOME/.bark-gui/training/data/output $HOME/.bark-gui/training/inputtext $HOME/.bark-gui/bark/assets/prompts/custom/
fi
pushd "$PWD"
cd $HOME/.bark-gui/
MYOLDPATH="$PATH"
export PATH="$PATH:${ffmpeg-full.bin}/bin/"
python webui.py "$@"
export PATH="$MYOLDPATH"
popd
'';
in
''
mkdir -p $out/bin
ln -s ${setupScript} $out/bin/bark-gui
'';
buildPhase = ''
mkdir -p dist
runHook preBuild
cp -r . $out
chmod -R +w $out
cd $out
chmod +x webui.py
#add shbang to webui.py
cat <<-EOF > webui.py
$(echo "#!/usr/bin/python")
$(cat webui.py)
EOF
mkdir -p $out/bin
ln -s webui-wrapped.py $out/bin/bark-gui
makeWrapper "$(pwd)/webui.py" "$out/bin/bark-gui" --set-default PYTHONPATH=$PYTHONPATH
chmod +x $out/bin/bark-gui
runHook postBuild
'';
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";
mainProgram = "bark-gui";
};

View file

@ -84,11 +84,10 @@ in
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 {
packages = {
kohya_ss-nvidia = mkkohya_ssVariant {
python3Packages = python3Variants.nvidia;
};
};
legacyPackages = {

View file

@ -1,114 +1,190 @@
{ python3Packages
, lib
, src
{ lib
, pythonRelaxDepsHook
, 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";
format = "other";
format = "pyproject";
version = "v22.1.1";
inherit src;
propagatedBuildInputs = with python3Packages; [
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
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 ];
propagatedBuildInputs = [
deforum
rich
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
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
poetry-core
xformers
python-multipart
easygui
];
nativeBuildInputs = [ 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;
doCheck = false;
dontUsePytestCheck = true;
buildPhase = ''
runHook preBuild
mkdir -p dist
cp -r . $out
chmod -R +w $out
cd $out
runHook preBuild
mkdir -p dist
mkdir -p $out
cp -r . $out
cd $out
--run setup.sh
mkdir -p $out/bin
mv gui.sh $out/bin/gui.sh
mkdir -p $out/bin
sed -i "2i echo $OSTYPE" $out/setup.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
'';
installPhase = ''
runHook preInstall
runHook postBuild
'';
runHook postInstall
'';
meta = {
description = "GUI for Kohya's Stable Diffusion trainers";
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