mirror of
https://github.com/denismhz/flake.git
synced 2025-11-09 16:16:23 +01:00
commit
e096e47e9e
17
flake.lock
17
flake.lock
|
|
@ -32,6 +32,22 @@
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"comfyui-src": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1702736172,
|
||||||
|
"narHash": "sha256-BYZHfnhdubasOAhUyq/iW4HvYKPiqBwiXY3ozZXU1Oc=",
|
||||||
|
"owner": "comfyanonymous",
|
||||||
|
"repo": "ComfyUI",
|
||||||
|
"rev": "6453dc1ca2d98d89af7cf312bb48d1e3fd2ca27f",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "comfyanonymous",
|
||||||
|
"repo": "ComfyUI",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"flake-parts": {
|
"flake-parts": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs-lib": [
|
"nixpkgs-lib": [
|
||||||
|
|
@ -251,6 +267,7 @@
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"a1111-src": "a1111-src",
|
"a1111-src": "a1111-src",
|
||||||
"bark-gui-src": "bark-gui-src",
|
"bark-gui-src": "bark-gui-src",
|
||||||
|
"comfyui-src": "comfyui-src",
|
||||||
"flake-parts": "flake-parts",
|
"flake-parts": "flake-parts",
|
||||||
"hercules-ci-effects": "hercules-ci-effects",
|
"hercules-ci-effects": "hercules-ci-effects",
|
||||||
"invokeai-src": "invokeai-src",
|
"invokeai-src": "invokeai-src",
|
||||||
|
|
|
||||||
44
flake.nix
44
flake.nix
|
|
@ -7,6 +7,10 @@
|
||||||
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 = {
|
||||||
|
comfyui-src = {
|
||||||
|
url = github:comfyanonymous/ComfyUI;
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
nixpkgs-stable = {
|
nixpkgs-stable = {
|
||||||
url = github:NixOS/nixpkgs/nixos-23.05;
|
url = github:NixOS/nixpkgs/nixos-23.05;
|
||||||
};
|
};
|
||||||
|
|
@ -52,17 +56,38 @@
|
||||||
};
|
};
|
||||||
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; config.cudaSupport = true; };
|
||||||
|
_module.args.pkgs = import inputs.nixpkgs {
|
||||||
|
inherit system;
|
||||||
|
/*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: {
|
||||||
|
torch = python-prev.torch-bin;
|
||||||
|
}
|
||||||
|
)
|
||||||
|
];
|
||||||
|
}
|
||||||
|
)
|
||||||
|
];*/
|
||||||
|
config = { allowUnfree = true; cudaSupport = true; };
|
||||||
|
};
|
||||||
legacyPackages = {
|
legacyPackages = {
|
||||||
koboldai = builtins.throw ''
|
koboldai = builtins.throw ''
|
||||||
|
koboldai has been dropped from nixified.ai due to lack of upstream development,
|
||||||
|
try textgen instead which is better maintained. If you would like to use the last
|
||||||
|
available version of koboldai with nixified.ai, then run:
|
||||||
|
|
||||||
|
nix run github:nixified.ai/flake/0c58f8cba3fb42c54f2a7bf9bd45ee4cbc9f2477#koboldai
|
||||||
koboldai has been dropped from nixified.ai due to lack of upstream development,
|
|
||||||
try textgen instead which is better maintained. If you would like to use the last
|
|
||||||
available version of koboldai with nixified.ai, then run:
|
|
||||||
|
|
||||||
nix run github:nixified.ai/flake/0c58f8cba3fb42c54f2a7bf9bd45ee4cbc9f2477#koboldai
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
@ -72,8 +97,9 @@
|
||||||
debug = true;
|
debug = true;
|
||||||
imports = [
|
imports = [
|
||||||
hercules-ci-effects.flakeModule
|
hercules-ci-effects.flakeModule
|
||||||
# ./modules/nixpkgs-config
|
# ./modules/nixpkgs-config
|
||||||
./overlays
|
./overlays
|
||||||
|
./projects/comfyui
|
||||||
./projects/automatic1111
|
./projects/automatic1111
|
||||||
./projects/invokeai
|
./projects/invokeai
|
||||||
./projects/textgen
|
./projects/textgen
|
||||||
|
|
|
||||||
24
packages/pyfunctional/default.nix
Normal file
24
packages/pyfunctional/default.nix
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
|
||||||
|
{ buildPythonPackage, lib, fetchPypi
|
||||||
|
}:
|
||||||
|
|
||||||
|
buildPythonPackage rec {
|
||||||
|
pname = "PyFunctional";
|
||||||
|
version = "1.4.3";
|
||||||
|
|
||||||
|
src = fetchPypi {
|
||||||
|
inherit pname version;
|
||||||
|
sha256 = "sha256-EcMT/iUbJpxlBmiRNUVqBbxab6EpydArRF84PU9BHhA=";
|
||||||
|
};
|
||||||
|
|
||||||
|
propagatedBuildInputs = [
|
||||||
|
];
|
||||||
|
|
||||||
|
# TODO FIXME
|
||||||
|
doCheck = false;
|
||||||
|
|
||||||
|
meta = with lib; {
|
||||||
|
description = "PyFunctional makes creating data pipelines easy by using chained functional operators.";
|
||||||
|
homepage = "https://github.com/EntilZha/PyFunctional";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
@ -1,23 +1,177 @@
|
||||||
# WARNING: This file was automatically generated. You should avoid editing it.
|
{ lib
|
||||||
# If you run pynixify again, the file will be either overwritten or
|
, buildPythonPackage
|
||||||
# deleted, and you will lose the changes you made to it.
|
, pythonOlder
|
||||||
|
, fetchFromGitHub
|
||||||
|
, which
|
||||||
|
# runtime dependencies
|
||||||
|
, numpy
|
||||||
|
, torch
|
||||||
|
# check dependencies
|
||||||
|
, pytestCheckHook
|
||||||
|
, pytest-cov
|
||||||
|
# , pytest-mpi
|
||||||
|
, pytest-timeout
|
||||||
|
# , pytorch-image-models
|
||||||
|
, hydra-core
|
||||||
|
, fairscale
|
||||||
|
, scipy
|
||||||
|
, cmake
|
||||||
|
, openai-triton
|
||||||
|
, networkx
|
||||||
|
#, apex
|
||||||
|
, einops
|
||||||
|
, transformers
|
||||||
|
, timm
|
||||||
|
#, flash-attn
|
||||||
|
, cudaPackages
|
||||||
|
, stable-pkgs
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
inherit (cudaPackages) cudaFlags cudnn;
|
||||||
|
|
||||||
{ buildPythonPackage, fetchPypi, lib, torch, numpy, pyre-extensions, pythonRelaxDepsHook, which }:
|
# Some packages are not available on all platforms
|
||||||
|
nccl = cudaPackages.nccl or null;
|
||||||
|
|
||||||
buildPythonPackage rec {
|
setBool = v: if v then "1" else "0";
|
||||||
|
|
||||||
|
# https://github.com/pytorch/pytorch/blob/v2.0.1/torch/utils/cpp_extension.py#L1744
|
||||||
|
supportedTorchCudaCapabilities =
|
||||||
|
let
|
||||||
|
real = ["3.5" "3.7" "5.0" "5.2" "5.3" "6.0" "6.1" "6.2" "7.0" "7.2" "7.5" "8.0" "8.6" "8.7" "8.9" "9.0"];
|
||||||
|
ptx = lists.map (x: "${x}+PTX") real;
|
||||||
|
in
|
||||||
|
real ++ ptx;
|
||||||
|
|
||||||
|
# NOTE: The lists.subtractLists function is perhaps a bit unintuitive. It subtracts the elements
|
||||||
|
# of the first list *from* the second list. That means:
|
||||||
|
# lists.subtractLists a b = b - a
|
||||||
|
|
||||||
|
# For CUDA
|
||||||
|
supportedCudaCapabilities = lists.intersectLists cudaFlags.cudaCapabilities supportedTorchCudaCapabilities;
|
||||||
|
unsupportedCudaCapabilities = lists.subtractLists supportedCudaCapabilities cudaFlags.cudaCapabilities;
|
||||||
|
|
||||||
|
# Use trivial.warnIf to print a warning if any unsupported GPU targets are specified.
|
||||||
|
gpuArchWarner = supported: unsupported:
|
||||||
|
trivial.throwIf (supported == [ ])
|
||||||
|
(
|
||||||
|
"No supported GPU targets specified. Requested GPU targets: "
|
||||||
|
+ strings.concatStringsSep ", " unsupported
|
||||||
|
)
|
||||||
|
supported;
|
||||||
|
|
||||||
|
# Create the gpuTargetString.
|
||||||
|
gpuTargetString = strings.concatStringsSep ";" (
|
||||||
|
if gpuTargets != [ ] then
|
||||||
|
# If gpuTargets is specified, it always takes priority.
|
||||||
|
gpuTargets
|
||||||
|
else if rocmSupport then
|
||||||
|
rocmPackages.clr.gpuTargets
|
||||||
|
else
|
||||||
|
gpuArchWarner supportedCudaCapabilities unsupportedCudaCapabilities
|
||||||
|
);
|
||||||
|
|
||||||
|
version = "0.0.22.post7";
|
||||||
|
in
|
||||||
|
buildPythonPackage {
|
||||||
pname = "xformers";
|
pname = "xformers";
|
||||||
version = "0.0.16";
|
inherit version;
|
||||||
|
format = "setuptools";
|
||||||
|
|
||||||
src = fetchPypi {
|
disabled = pythonOlder "3.7";
|
||||||
inherit pname version;
|
|
||||||
sha256 = "sha256-ksfwVWpo9EhkkmkbP1ZxQO4ZK1Y9kEGFtmabH4u4rlM=";
|
src = fetchFromGitHub {
|
||||||
|
owner = "facebookresearch";
|
||||||
|
repo = "xformers";
|
||||||
|
rev = "refs/tags/v${version}";
|
||||||
|
hash = "sha256-7lZi3+2dVDZJFYCUlxsyDU8t9qdnl+b2ERRXKA6Zp7U=";
|
||||||
|
fetchSubmodules = true;
|
||||||
};
|
};
|
||||||
nativeBuildInputs = [ pythonRelaxDepsHook which ];
|
|
||||||
pythonRelaxDeps = [ "pyre-extensions" ];
|
|
||||||
propagatedBuildInputs = [ torch numpy pyre-extensions /*triton*/ ];
|
|
||||||
|
|
||||||
# TODO FIXME
|
preConfigure = ''
|
||||||
|
export TORCH_CUDA_ARCH_LIST="${gpuTargetString}"
|
||||||
|
export CUDNN_INCLUDE_DIR=${cudnn.dev}/include
|
||||||
|
export CUDNN_LIB_DIR=${cudnn.lib}/lib
|
||||||
|
export CUPTI_INCLUDE_DIR=${cudaPackages.cuda_cupti.dev}/include
|
||||||
|
export CUPTI_LIBRARY_DIR=${cudaPackages.cuda_cupti.lib}/lib
|
||||||
|
export CUDA_PATH=${stable-packages.cudatoolkit}
|
||||||
|
export EXTRA_LD_FLAGS="-L${stable-pkgs.linuxPackages.nvidia_x11_production}/lib"
|
||||||
|
'';
|
||||||
|
|
||||||
|
preBuild = ''
|
||||||
|
cat << EOF > ./xformers/version.py
|
||||||
|
# noqa: C801
|
||||||
|
__version__ = "${version}"
|
||||||
|
EOF
|
||||||
|
'';
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
which
|
||||||
|
] ++ (with cudaPackages; [
|
||||||
|
autoAddOpenGLRunpathHook
|
||||||
|
cuda_nvcc
|
||||||
|
]);
|
||||||
|
|
||||||
|
propagatedBuildInputs = [
|
||||||
|
numpy
|
||||||
|
torch
|
||||||
|
];
|
||||||
|
|
||||||
|
buildInputs = with cudaPackages; [
|
||||||
|
cuda_cccl.dev # <thrust/*>
|
||||||
|
cuda_cudart # cuda_runtime.h and libraries
|
||||||
|
cuda_cupti.dev # For kineto
|
||||||
|
cuda_cupti.lib # For kineto
|
||||||
|
cuda_nvcc.dev # crt/host_config.h; even though we include this in nativeBuildinputs, it's needed here too
|
||||||
|
cuda_nvml_dev.dev # <nvml.h>
|
||||||
|
cuda_nvrtc.dev
|
||||||
|
cuda_nvrtc.lib
|
||||||
|
cuda_nvtx.dev
|
||||||
|
cuda_nvtx.lib # -llibNVToolsExt
|
||||||
|
cudnn.dev
|
||||||
|
cudnn.lib
|
||||||
|
libcublas.dev
|
||||||
|
libcublas.lib
|
||||||
|
libcufft.dev
|
||||||
|
libcufft.lib
|
||||||
|
libcurand.dev
|
||||||
|
libcurand.lib
|
||||||
|
libcusolver.dev
|
||||||
|
libcusolver.lib
|
||||||
|
libcusparse.dev
|
||||||
|
libcusparse.lib
|
||||||
|
effectiveMagma
|
||||||
|
numactl
|
||||||
|
] ++ [stable-pkgs.linuxPackages.nvidia_x11_production gcc stable-packages.cudatoolkit];
|
||||||
|
|
||||||
|
pythonImportsCheck = [ "xformers" ];
|
||||||
|
|
||||||
|
dontUseCmakeConfigure = true;
|
||||||
|
|
||||||
|
# see commented out missing packages
|
||||||
doCheck = false;
|
doCheck = false;
|
||||||
|
|
||||||
meta = with lib; { };
|
nativeCheckInputs = [
|
||||||
|
pytestCheckHook
|
||||||
|
pytest-cov
|
||||||
|
pytest-timeout
|
||||||
|
hydra-core
|
||||||
|
fairscale
|
||||||
|
scipy
|
||||||
|
cmake
|
||||||
|
networkx
|
||||||
|
openai-triton
|
||||||
|
# apex
|
||||||
|
einops
|
||||||
|
transformers
|
||||||
|
timm
|
||||||
|
# flash-attn
|
||||||
|
];
|
||||||
|
|
||||||
|
meta = with lib; {
|
||||||
|
description = "XFormers: A collection of composable Transformer building blocks";
|
||||||
|
homepage = "https://github.com/facebookresearch/xformers";
|
||||||
|
changelog = "https://github.com/facebookresearch/xformers/blob/${version}/CHANGELOG.md";
|
||||||
|
license = licenses.bsd3;
|
||||||
|
maintainers = with maintainers; [ happysalada ];
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
@ -13,11 +13,11 @@ in
|
||||||
#cant i do like only for this for invoke other version?
|
#cant i do like only for this for invoke other version?
|
||||||
(
|
(
|
||||||
final: prev: {
|
final: prev: {
|
||||||
pillow = pkgs.python3.pkgs.callPackage ../../packages/pillow { };
|
|
||||||
pythonPackagesExtensions = prev.pythonPackagesExtensions ++ [
|
pythonPackagesExtensions = prev.pythonPackagesExtensions ++ [
|
||||||
(
|
(
|
||||||
python-final: python-prev: {
|
python-final: python-prev: {
|
||||||
pillow = python-final.callPackage ../../packages/pillow { };
|
pillow = python-final.callPackage ../../packages/pillow { };
|
||||||
|
xformers = python-final.callPackage ../../packages/xformers { inherit stable-pkgs; };
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
];
|
];
|
||||||
|
|
@ -30,21 +30,25 @@ in
|
||||||
../../packages/blendmodes
|
../../packages/blendmodes
|
||||||
../../packages/blip
|
../../packages/blip
|
||||||
../../packages/codeformer
|
../../packages/codeformer
|
||||||
|
../../packages/deforum
|
||||||
../../packages/facexlib
|
../../packages/facexlib
|
||||||
../../packages/gfpgan
|
../../packages/gfpgan
|
||||||
../../packages/gradio
|
../../packages/gradio
|
||||||
../../packages/gradio-client
|
../../packages/gradio-client
|
||||||
../../packages/k_diffusion
|
../../packages/k_diffusion
|
||||||
../../packages/lpips
|
../../packages/lpips
|
||||||
|
../../packages/mediapipe
|
||||||
../../packages/openclip
|
../../packages/openclip
|
||||||
../../packages/pillow
|
../../packages/pillow
|
||||||
|
../../packages/pyfunctional
|
||||||
../../packages/pytorch-lightning
|
../../packages/pytorch-lightning
|
||||||
../../packages/realesrgan
|
../../packages/realesrgan
|
||||||
../../packages/taming-transformers-rom1504
|
../../packages/taming-transformers-rom1504
|
||||||
../../packages/tomesd
|
../../packages/tomesd
|
||||||
../../packages/torch-fidelity
|
#../../packages/torch-fidelity
|
||||||
../../packages/torch-grammar
|
#../../packages/torch-grammar
|
||||||
../../packages/xformers
|
../../packages/ultralytics
|
||||||
|
../../packages/zipunicode
|
||||||
])
|
])
|
||||||
(final: prev: lib.mapAttrs
|
(final: prev: lib.mapAttrs
|
||||||
(_: pkg: pkg.overrideAttrs (old: {
|
(_: pkg: pkg.overrideAttrs (old: {
|
||||||
|
|
@ -69,8 +73,16 @@ in
|
||||||
]);
|
]);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
stable-pkgs = import inputs.nixpkgs-stable {
|
||||||
|
allowUnfree = true;
|
||||||
|
cudaSupport = true;
|
||||||
|
inherit system;
|
||||||
|
};
|
||||||
|
|
||||||
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; inherit stable-pkgs pkgs;
|
||||||
|
} // args);
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
packages = {
|
packages = {
|
||||||
|
|
@ -90,9 +102,9 @@ in
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
a1111 = ./nixos;
|
a1111 = ./nixos;
|
||||||
invokeai-nvidia = {
|
a1111-nvidia = {
|
||||||
imports = [
|
imports = [
|
||||||
config.flake.nixosModules.invokeai
|
config.flake.nixosModules.a1111
|
||||||
(packageModule "a1111-nvidia")
|
(packageModule "a1111-nvidia")
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -8,33 +8,33 @@ let
|
||||||
floatToString optionalString
|
floatToString optionalString
|
||||||
;
|
;
|
||||||
|
|
||||||
cfg = config.services.invokeai;
|
cfg = config.services.a1111;
|
||||||
in
|
in
|
||||||
|
|
||||||
{
|
{
|
||||||
imports = map ({ old, new ? old }: mkRenamedOptionModule [ "services" "invokeai" old ] [ "services" "invokeai" "settings" new ]) [
|
imports = map ({ old, new ? old }: mkRenamedOptionModule [ "services" "a1111" old ] [ "services" "a1111" "settings" new ]) [
|
||||||
{ old = "host"; }
|
{ old = "host"; }
|
||||||
{ old = "port"; }
|
{ old = "port"; }
|
||||||
{ old = "dataDir"; new = "root"; }
|
{ old = "dataDir"; new = "root"; }
|
||||||
{ old = "precision"; }
|
{ old = "precision"; }
|
||||||
];
|
];
|
||||||
options.services.invokeai = {
|
options.services.a1111 = {
|
||||||
enable = mkEnableOption "InvokeAI Web UI for Stable Diffusion";
|
enable = mkEnableOption "Automatic1111 UI for Stable Diffusion";
|
||||||
|
|
||||||
package = mkOption {
|
package = mkOption {
|
||||||
description = "Which InvokeAI package to use.";
|
description = "Which Automatic1111 package to use.";
|
||||||
type = types.package;
|
type = types.package;
|
||||||
};
|
};
|
||||||
|
|
||||||
user = mkOption {
|
user = mkOption {
|
||||||
description = "Which user to run InvokeAI as.";
|
description = "Which user to run A1111 as.";
|
||||||
default = "invokeai";
|
default = "a1111";
|
||||||
type = types.str;
|
type = types.str;
|
||||||
};
|
};
|
||||||
|
|
||||||
group = mkOption {
|
group = mkOption {
|
||||||
description = "Which group to run InvokeAI as.";
|
description = "Which group to run A1111 as.";
|
||||||
default = "invokeai";
|
default = "a1111";
|
||||||
type = types.str;
|
type = types.str;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -51,28 +51,28 @@ in
|
||||||
]);
|
]);
|
||||||
in attrsOf (either atom (listOf atom));
|
in attrsOf (either atom (listOf atom));
|
||||||
options = {
|
options = {
|
||||||
host = mkOption {
|
#listen = mkOption {
|
||||||
description = "Which IP address to listen on.";
|
# description = "Launch gradio with 0.0.0.0 as server name, allowing to respond to network requests.";
|
||||||
default = "127.0.0.1";
|
# default = false;
|
||||||
type = types.str;
|
# type = types.bool;
|
||||||
};
|
#};
|
||||||
|
|
||||||
port = mkOption {
|
port = mkOption {
|
||||||
description = "Which port to listen on.";
|
description = "Launch gradio with given server port, you need root/admin rights for ports < 1024; defaults to 7860 if available.";
|
||||||
default = 9090;
|
default = 7860;
|
||||||
type = types.port;
|
type = types.port;
|
||||||
};
|
};
|
||||||
|
|
||||||
root = mkOption {
|
data-dir = mkOption {
|
||||||
description = "Where to store InvokeAI's state.";
|
description = "Where to store A1111's state.";
|
||||||
default = "/var/lib/invokeai";
|
default = "/var/lib/a1111";
|
||||||
type = types.path;
|
type = types.path;
|
||||||
};
|
};
|
||||||
|
|
||||||
precision = mkOption {
|
ckpt-dir = mkOption {
|
||||||
description = "Set model precision.";
|
description = "Path to A1111's SD models.";
|
||||||
default = "auto";
|
default = "/var/lib/models/ckpt";
|
||||||
type = types.enum [ "auto" "float32" "autocast" "float16" ];
|
type = types.path;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
@ -89,7 +89,7 @@ in
|
||||||
|
|
||||||
cliArgs = (flatten (mapAttrsToList (n: v:
|
cliArgs = (flatten (mapAttrsToList (n: v:
|
||||||
if v == null then []
|
if v == null then []
|
||||||
else if isBool v then [ "--${optionalString (!v) "no-"}${n}" ]
|
#else if isBool v then [ "--${optionalString (!v) "no-"}${n}" ]
|
||||||
else if isInt v then [ "--${n}" "${toString v}" ]
|
else if isInt v then [ "--${n}" "${toString v}" ]
|
||||||
else if isFloat v then [ "--${n}" "${floatToString v}" ]
|
else if isFloat v then [ "--${n}" "${floatToString v}" ]
|
||||||
else if isString v then ["--${n}" v ]
|
else if isString v then ["--${n}" v ]
|
||||||
|
|
@ -98,34 +98,34 @@ in
|
||||||
) cfg.settings)) ++ cfg.extraArgs;
|
) cfg.settings)) ++ cfg.extraArgs;
|
||||||
|
|
||||||
in mkIf cfg.enable {
|
in mkIf cfg.enable {
|
||||||
users.users = mkIf (cfg.user == "invokeai") {
|
users.users = mkIf (cfg.user == "a1111") {
|
||||||
invokeai = {
|
a1111 = {
|
||||||
isSystemUser = true;
|
isSystemUser = true;
|
||||||
inherit (cfg) group;
|
inherit (cfg) group;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
users.groups = mkIf (cfg.group == "invokeai") {
|
users.groups = mkIf (cfg.group == "a1111") {
|
||||||
invokeai = {};
|
a1111 = {};
|
||||||
};
|
};
|
||||||
systemd.services.invokeai = {
|
systemd.services.a1111 = {
|
||||||
after = [ "network.target" ];
|
after = [ "network.target" ];
|
||||||
wantedBy = [ "multi-user.target" ];
|
wantedBy = [ "multi-user.target" ];
|
||||||
environment = {
|
environment = {
|
||||||
HOME = "${cfg.settings.root}/.home";
|
HOME = "${cfg.settings.data-dir}/.home";
|
||||||
INVOKEAI_ROOT = "${cfg.settings.root}";
|
COMMANDLINE_ARGS = escapeShellArgs cliArgs;
|
||||||
NIXIFIED_AI_NONINTERACTIVE = "1";
|
NIXIFIED_AI_NONINTERACTIVE = "1";
|
||||||
};
|
};
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
User = cfg.user;
|
User = cfg.user;
|
||||||
Group = cfg.group;
|
Group = cfg.group;
|
||||||
ExecStart = "${getExe cfg.package} ${escapeShellArgs cliArgs}";
|
ExecStart = "${getExe cfg.package}";
|
||||||
PrivateTmp = true;
|
PrivateTmp = true;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
systemd.tmpfiles.rules = [
|
systemd.tmpfiles.rules = [
|
||||||
"d '${cfg.settings.root}' 0755 ${cfg.user} ${cfg.group} - -"
|
"d '${cfg.settings.data-dir}/' 0755 ${cfg.user} ${cfg.group} - -"
|
||||||
"d '${cfg.settings.root}/configs' 0755 ${cfg.user} ${cfg.group} - -"
|
"d '${cfg.settings.data-dir}/configs' 0755 ${cfg.user} ${cfg.group} - -"
|
||||||
"d '${cfg.settings.root}/.home' 0750 ${cfg.user} ${cfg.group} - -"
|
"d '${cfg.settings.data-dir}/.home' 0750 ${cfg.user} ${cfg.group} - -"
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@
|
||||||
, # misc
|
, # misc
|
||||||
lib
|
lib
|
||||||
, src
|
, src
|
||||||
|
, stable-pkgs
|
||||||
|
, pkgs
|
||||||
# extra deps
|
# extra deps
|
||||||
}:
|
}:
|
||||||
python3Packages.buildPythonPackage {
|
python3Packages.buildPythonPackage {
|
||||||
|
|
@ -36,13 +38,38 @@ python3Packages.buildPythonPackage {
|
||||||
taming-transformers-rom1504
|
taming-transformers-rom1504
|
||||||
timm
|
timm
|
||||||
tomesd
|
tomesd
|
||||||
torch
|
torchWithCuda
|
||||||
transformers
|
transformers
|
||||||
xformers
|
xformers
|
||||||
|
|
||||||
|
#For Extensions -- dont know if e.g you dont install image browser then maybe lack of dep for civitai browser
|
||||||
|
pyfunctional #infinite image browser
|
||||||
|
dill #infinite image browser
|
||||||
|
python-dotenv #infinite image browser
|
||||||
|
fastapi #infinite image browser
|
||||||
|
uvicorn #infinite image browser
|
||||||
|
tabulate #infinite image browser
|
||||||
|
#infinite image browser sends dleted images to nirvana
|
||||||
|
|
||||||
|
send2trash #civitai browser+
|
||||||
|
zipunicode #civitai browser+
|
||||||
|
fake-useragent #civitai browser+
|
||||||
|
|
||||||
|
rich #adetailer
|
||||||
|
ultralytics #adetailer
|
||||||
|
py-cpuinfo #adetailer
|
||||||
|
mediapipe #adeteailer
|
||||||
|
|
||||||
|
av #animatediff to create webm and other fileformats
|
||||||
|
|
||||||
|
numexpr #deforum
|
||||||
|
deforum #deforum
|
||||||
];
|
];
|
||||||
|
|
||||||
patches = [ ./_outputpaths.patch ];
|
patches = [ ./_outputpaths.patch ];
|
||||||
|
|
||||||
|
nativeBuildInputs = [ pkgs.cudatoolkit ];
|
||||||
|
|
||||||
buildPhase =
|
buildPhase =
|
||||||
''
|
''
|
||||||
runHook preBuild
|
runHook preBuild
|
||||||
|
|
@ -70,12 +97,12 @@ python3Packages.buildPythonPackage {
|
||||||
chmod +x launch.py
|
chmod +x launch.py
|
||||||
makeWrapper "$out/launch.py" $out/bin/launch-wrapped.py \
|
makeWrapper "$out/launch.py" $out/bin/launch-wrapped.py \
|
||||||
--run 'export COMMANDLINE_ARGS="''${COMMANDLINE_ARGS:-\
|
--run 'export COMMANDLINE_ARGS="''${COMMANDLINE_ARGS:-\
|
||||||
--data-dir $HOME/webui --skip-install \
|
--data-dir $HOME/webui --skip-install --xformers \
|
||||||
--theme dark --ckpt-dir $HOME/webui/models/ckpt \
|
--theme dark --ckpt-dir $HOME/webui/models/ckpt \
|
||||||
--embeddings-dir $HOME/webui/models/embeddings \
|
--embeddings-dir $HOME/webui/models/embeddings \
|
||||||
--medvram --no-half-vae}"' \
|
--medvram --no-half-vae}"' \
|
||||||
--set-default PYTHONPATH $PYTHONPATH \
|
--set-default PYTHONPATH $PYTHONPATH \
|
||||||
--chdir $out
|
--chdir $out --set-default CUDA_PATH ${pkgs.cudatoolkit}
|
||||||
|
|
||||||
rm -rf dist
|
rm -rf dist
|
||||||
|
|
||||||
|
|
@ -111,4 +138,11 @@ python3Packages.buildPythonPackage {
|
||||||
homepage = "https://github.com/AUTOMATIC1111/stable-diffusion-webui";
|
homepage = "https://github.com/AUTOMATIC1111/stable-diffusion-webui";
|
||||||
mainProgram = "launch-wrapped.py";
|
mainProgram = "launch-wrapped.py";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#Tiled VAE supported without additional dependencies
|
||||||
|
#Infinit image browser couple of deps
|
||||||
|
#civit-ai browser + couple of deps
|
||||||
|
#animatediff --> needs deforum for frame interpolation
|
||||||
|
#deforum
|
||||||
|
#controlnet
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -35,17 +35,17 @@ in
|
||||||
|
|
||||||
flake.nixosModules = let
|
flake.nixosModules = let
|
||||||
packageModule = pkgAttrName: { pkgs, ... }: {
|
packageModule = pkgAttrName: { pkgs, ... }: {
|
||||||
services.a1111.package = withSystem pkgs.system (
|
services.bark-gui.package = withSystem pkgs.system (
|
||||||
{ config, ... }: lib.mkOptionDefault config.packages.${pkgAttrName}
|
{ config, ... }: lib.mkOptionDefault config.packages.${pkgAttrName}
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
in {
|
in {
|
||||||
bark-gui = ./nixos;
|
#bark-gui = ./nixos;
|
||||||
invokeai-nvidia = {
|
#invokeai-nvidia = {
|
||||||
imports = [
|
# imports = [
|
||||||
config.flake.nixosModules.invokeai
|
# config.flake.nixosModules.invokeai
|
||||||
(packageModule "bark-gui-nvidia")
|
# (packageModule "bark-gui-nvidia")
|
||||||
];
|
# ];
|
||||||
};
|
#};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,15 +20,13 @@ python3Packages.buildPythonPackage {
|
||||||
pytorch-seed
|
pytorch-seed
|
||||||
safetensors
|
safetensors
|
||||||
scipy
|
scipy
|
||||||
torch-bin
|
torch
|
||||||
torchaudio-bin
|
torchaudio
|
||||||
transformers
|
transformers
|
||||||
vector-quantize-pytorch
|
vector-quantize-pytorch
|
||||||
];
|
];
|
||||||
#nativeBuildInputs = with python3Packages; [ pythonRelaxDepsHook pip ];
|
#nativeBuildInputs = with python3Packages; [ pythonRelaxDepsHook pip ];
|
||||||
nativeBuildInputs = with python3Packages; [ setuptools 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 = [
|
makeWrapperArgs = [
|
||||||
'' --set-default PYTHONPATH=$PYTHONPATH ''
|
'' --set-default PYTHONPATH=$PYTHONPATH ''
|
||||||
|
|
|
||||||
40
projects/comfyui/default.nix
Normal file
40
projects/comfyui/default.nix
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
{ config, inputs, lib, withSystem, ... }:
|
||||||
|
{
|
||||||
|
perSystem = { config, pkgs, system, ... }:
|
||||||
|
let
|
||||||
|
src = inputs.comfyui-src;
|
||||||
|
|
||||||
|
stable-pkgs = import inputs.nixpkgs-stable {
|
||||||
|
allowUnfree = true;
|
||||||
|
cudaSupport = true;
|
||||||
|
inherit system;
|
||||||
|
};
|
||||||
|
|
||||||
|
mkComfyUIVariant = args: pkgs.python310Packages.callPackage ./package.nix ({
|
||||||
|
inherit src;
|
||||||
|
} // args);
|
||||||
|
in
|
||||||
|
{
|
||||||
|
packages = {
|
||||||
|
comfyui-nvidia = mkComfyUIVariant { };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
#flake.nixosModules =
|
||||||
|
/* let
|
||||||
|
packageModule = pkgAttrName: { pkgs, ... }: {
|
||||||
|
services.comfyui.package = withSystem pkgs.system (
|
||||||
|
{ config, ... }: lib.mkOptionDefault config.packages.${pkgAttrName}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
comfyui = ./nixos;
|
||||||
|
comfyui-nvidia = {
|
||||||
|
imports = [
|
||||||
|
config.flake.nixosModules.a1111
|
||||||
|
(packageModule "comfyui-nvidia")
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};*/
|
||||||
|
}
|
||||||
131
projects/comfyui/nixos/default.nix
Normal file
131
projects/comfyui/nixos/default.nix
Normal 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.comfyui;
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = map ({ old, new ? old }: mkRenamedOptionModule [ "services" "comfyui" old ] [ "services" "comfyui" "settings" new ]) [
|
||||||
|
{ old = "host"; }
|
||||||
|
{ old = "port"; }
|
||||||
|
{ old = "dataDir"; new = "root"; }
|
||||||
|
{ old = "precision"; }
|
||||||
|
];
|
||||||
|
options.services.a1111 = {
|
||||||
|
enable = mkEnableOption "Automatic1111 UI for Stable Diffusion";
|
||||||
|
|
||||||
|
package = mkOption {
|
||||||
|
description = "Which Automatic1111 package to use.";
|
||||||
|
type = types.package;
|
||||||
|
};
|
||||||
|
|
||||||
|
user = mkOption {
|
||||||
|
description = "Which user to run A1111 as.";
|
||||||
|
default = "a1111";
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
|
||||||
|
group = mkOption {
|
||||||
|
description = "Which group to run A1111 as.";
|
||||||
|
default = "a1111";
|
||||||
|
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 = {
|
||||||
|
#listen = mkOption {
|
||||||
|
# description = "Launch gradio with 0.0.0.0 as server name, allowing to respond to network requests.";
|
||||||
|
# default = false;
|
||||||
|
# type = types.bool;
|
||||||
|
#};
|
||||||
|
|
||||||
|
port = mkOption {
|
||||||
|
description = "Launch gradio with given server port, you need root/admin rights for ports < 1024; defaults to 7860 if available.";
|
||||||
|
default = 7860;
|
||||||
|
type = types.port;
|
||||||
|
};
|
||||||
|
|
||||||
|
data-dir = mkOption {
|
||||||
|
description = "Where to store A1111's state.";
|
||||||
|
default = "/var/lib/a1111";
|
||||||
|
type = types.path;
|
||||||
|
};
|
||||||
|
|
||||||
|
ckpt-dir = mkOption {
|
||||||
|
description = "Path to A1111's SD models.";
|
||||||
|
default = "/var/lib/models/ckpt";
|
||||||
|
type = types.path;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
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 == "a1111") {
|
||||||
|
a1111 = {
|
||||||
|
isSystemUser = true;
|
||||||
|
inherit (cfg) group;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
users.groups = mkIf (cfg.group == "a1111") {
|
||||||
|
a1111 = {};
|
||||||
|
};
|
||||||
|
systemd.services.a1111 = {
|
||||||
|
after = [ "network.target" ];
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
environment = {
|
||||||
|
HOME = "${cfg.settings.data-dir}/.home";
|
||||||
|
COMMANDLINE_ARGS = escapeShellArgs cliArgs;
|
||||||
|
NIXIFIED_AI_NONINTERACTIVE = "1";
|
||||||
|
};
|
||||||
|
serviceConfig = {
|
||||||
|
User = cfg.user;
|
||||||
|
Group = cfg.group;
|
||||||
|
ExecStart = "${getExe cfg.package}";
|
||||||
|
PrivateTmp = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
systemd.tmpfiles.rules = [
|
||||||
|
"d '${cfg.settings.data-dir}/' 0755 ${cfg.user} ${cfg.group} - -"
|
||||||
|
"d '${cfg.settings.data-dir}/configs' 0755 ${cfg.user} ${cfg.group} - -"
|
||||||
|
"d '${cfg.settings.data-dir}/.home' 0750 ${cfg.user} ${cfg.group} - -"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
70
projects/comfyui/package.nix
Normal file
70
projects/comfyui/package.nix
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
{ src
|
||||||
|
, buildPythonPackage
|
||||||
|
, torchvision-bin
|
||||||
|
, torch-bin
|
||||||
|
, safetensors
|
||||||
|
, psutil
|
||||||
|
, einops
|
||||||
|
, transformers
|
||||||
|
, scipy
|
||||||
|
, torchsde
|
||||||
|
, pillow
|
||||||
|
, torch
|
||||||
|
, torchvision
|
||||||
|
, accelerate
|
||||||
|
}:
|
||||||
|
buildPythonPackage {
|
||||||
|
pname = "ComfyUI";
|
||||||
|
format = "other";
|
||||||
|
version = "latest";
|
||||||
|
inherit src;
|
||||||
|
propagatedBuildInputs = [
|
||||||
|
accelerate
|
||||||
|
torchvision
|
||||||
|
torch
|
||||||
|
safetensors
|
||||||
|
psutil
|
||||||
|
einops
|
||||||
|
transformers
|
||||||
|
scipy
|
||||||
|
pillow
|
||||||
|
torchsde
|
||||||
|
];
|
||||||
|
|
||||||
|
buildPhase =
|
||||||
|
''
|
||||||
|
runHook preBuild
|
||||||
|
|
||||||
|
mkdir -p dist
|
||||||
|
cp -R . $out
|
||||||
|
chmod -R +w $out
|
||||||
|
cd $out
|
||||||
|
|
||||||
|
#make main.py executable > shebang
|
||||||
|
mkdir -p $out/bin
|
||||||
|
cat <<-EOF > main.py
|
||||||
|
$(echo "#!/usr/bin/python")
|
||||||
|
$(cat main.py)
|
||||||
|
EOF
|
||||||
|
chmod +x main.py
|
||||||
|
makeWrapper "$out/main.py" $out/bin/main-wrapped.py \
|
||||||
|
--set-default PYTHONPATH $PYTHONPATH \
|
||||||
|
|
||||||
|
rm -rf dist
|
||||||
|
|
||||||
|
runHook postBuild
|
||||||
|
'';
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
description = "The most powerful and modular stable diffusion GUI and backend.";
|
||||||
|
homepage = "https://github.com/comfyanonymous/ComfyUI.git";
|
||||||
|
mainProgram = "main-wrapped.py";
|
||||||
|
};
|
||||||
|
|
||||||
|
#Tiled VAE supported without additional dependencies
|
||||||
|
#Infinit image browser couple of deps
|
||||||
|
#civit-ai browser + couple of deps
|
||||||
|
#animatediff --> needs deforum for frame interpolation
|
||||||
|
#deforum
|
||||||
|
#controlnet
|
||||||
|
}
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
# misc
|
# misc
|
||||||
, lib
|
, lib
|
||||||
, src
|
, src
|
||||||
|
, pkgs
|
||||||
# extra deps
|
# extra deps
|
||||||
}:
|
}:
|
||||||
|
|
||||||
|
|
@ -76,7 +77,7 @@ python3Packages.buildPythonPackage {
|
||||||
huggingface-hub
|
huggingface-hub
|
||||||
easing-functions
|
easing-functions
|
||||||
dynamicprompts
|
dynamicprompts
|
||||||
torchvision
|
torchvision-bin
|
||||||
test-tube
|
test-tube
|
||||||
];
|
];
|
||||||
nativeBuildInputs = with python3Packages; [ pythonRelaxDepsHook pip ];
|
nativeBuildInputs = with python3Packages; [ pythonRelaxDepsHook pip ];
|
||||||
|
|
|
||||||
|
|
@ -48,13 +48,13 @@ in
|
||||||
kohya_ss = ./nixos;
|
kohya_ss = ./nixos;
|
||||||
kohya_ss-amd = {
|
kohya_ss-amd = {
|
||||||
imports = [
|
imports = [
|
||||||
config.flake.nixosModules.invokeai
|
config.flake.nixosModules.kohya_ss
|
||||||
(packageModule "kohya_ss-amd")
|
(packageModule "kohya_ss-amd")
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
kohya_ss-nvidia = {
|
kohya_ss-nvidia = {
|
||||||
imports = [
|
imports = [
|
||||||
config.flake.nixosModules.invokeai
|
config.flake.nixosModules.kohya_ss
|
||||||
(packageModule "kohya_ss-nvidia")
|
(packageModule "kohya_ss-nvidia")
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -76,12 +76,14 @@ let
|
||||||
ln -s ${tmpDir}/presets/ $out/presets
|
ln -s ${tmpDir}/presets/ $out/presets
|
||||||
'';
|
'';
|
||||||
textgenPython = python3Packages.python.withPackages (_: with python3Packages; [
|
textgenPython = python3Packages.python.withPackages (_: with python3Packages; [
|
||||||
|
aiofiles
|
||||||
accelerate
|
accelerate
|
||||||
bitsandbytes
|
bitsandbytes
|
||||||
colorama
|
colorama
|
||||||
datasets
|
datasets
|
||||||
flexgen
|
flexgen
|
||||||
gradio
|
gradio
|
||||||
|
gradio-client
|
||||||
llama-cpp-python
|
llama-cpp-python
|
||||||
markdown
|
markdown
|
||||||
numpy
|
numpy
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue