Installer rewrite in Python (#2448)
## Summary This PR rewrites the core of the installer in Python for cross-platform compatibility. Filesystem path manipulation, platform/arch decisions and various edge cases are handled in a more convenient fashion. The original `install.bat.in`/`install.sh.in` scripts are kept as entrypoints for their respective OSs, but only serve as thin wrappers to the Python module. In addition, it: - builds and **packages the .whl with the installer**, so that downloading a versioned installer will guarantee installation of the same version of the application. - updates shell entrypoints: - new commands are `invokeai`, `invokeai-configure`, `invokeai-ti`, `invokeai-merge`. - these commands will be available in the activated `.venv` or via the launch scripts - `invoke.py` and `configure_invokeai.py` scripts are deprecated but kept around for backwards compatibility and keeping users' surprise to a minimum. - introduces a new `ldm/invoke/config` package and moves the `configure_invokeai` script into it. Similarly, movers Textual Inversion script and TUI to `ldm/invoke/training`. - moves the `configs` directory into the `ldm/invoke/config` package for easy distribution. - updates documentation to reflect all of the above changes - fixes a failing test - reduces wheel size to 3MB (from 27MB) by excluding unnecessary image files under `assets` ⚠️ self-updating functionality and ability to install arbitrary versions are still WIP. For now we can recommend downloading and running the installer for a specific version as desired. ## Testing the source install From the cloned source, check out this branch, and: `$ python3 installer/main.py --root <path_to_destination>` Also try: `$ python3 installer/main.py ` - will prompt for paths `$ python3 installer/main.py --yes` - will not prompt for any input - try to combine the `--yes` and `--root` options - try to install in destinations with "quirky" paths, such as paths containing spaces in the directory name, etc. ## Testing the packaged install ("Automated Installer"): Download the [InvokeAI-installer-v2.3.0+a0.zip](https://github.com/invoke-ai/InvokeAI/files/10533913/InvokeAI-installer-v2.3.0%2Ba0.zip) file, unzip it, and run the install script for your platform (preferably in a terminal window) OR make your own: from the cloned source, check out this branch, and: ``` cd installer ./create_installer.sh # (do NOT tag/push when prompted! just say "no") ``` This will create the installation media: `InvokeAI-installer-v2.3.0+a0.zip`. The installer is now *platform-agnostic* - meaning, both Windows and *nix install resources are packaged together. Copy it somewhere as if it had been downloaded from the internet. Unzip the file, enter the created `InvokeAI-Installer` directory, and run `install.sh` or `install.bat` as applicable your platform. ⚠️ NOTE!!! `install.sh` accepts the same arguments as are applicable to the Python script, i.e. you can `install.sh --yes --root ....`. This is NOT yet supported by the Windows `.bat` script. Only interactive installation is supported on Windows. (this is still a TODO).
6
.github/workflows/lint-frontend.yml
vendored
@ -3,14 +3,14 @@ name: Lint frontend
|
|||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- 'frontend/**'
|
- 'invokeai/frontend/**'
|
||||||
push:
|
push:
|
||||||
paths:
|
paths:
|
||||||
- 'frontend/**'
|
- 'invokeai/frontend/**'
|
||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: frontend
|
working-directory: invokeai/frontend
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint-frontend:
|
lint-frontend:
|
||||||
|
44
.github/workflows/test-invoke-pip.yml
vendored
@ -22,19 +22,19 @@ jobs:
|
|||||||
# - '3.9'
|
# - '3.9'
|
||||||
- '3.10'
|
- '3.10'
|
||||||
pytorch:
|
pytorch:
|
||||||
- linux-cuda-11_6
|
# - linux-cuda-11_6
|
||||||
- linux-cuda-11_7
|
- linux-cuda-11_7
|
||||||
- linux-rocm-5_2
|
- linux-rocm-5_2
|
||||||
- linux-cpu
|
- linux-cpu
|
||||||
- macos-default
|
- macos-default
|
||||||
- windows-cpu
|
- windows-cpu
|
||||||
- windows-cuda-11_6
|
# - windows-cuda-11_6
|
||||||
- windows-cuda-11_7
|
# - windows-cuda-11_7
|
||||||
include:
|
include:
|
||||||
- pytorch: linux-cuda-11_6
|
# - pytorch: linux-cuda-11_6
|
||||||
os: ubuntu-22.04
|
# os: ubuntu-22.04
|
||||||
extra-index-url: 'https://download.pytorch.org/whl/cu116'
|
# extra-index-url: 'https://download.pytorch.org/whl/cu116'
|
||||||
github-env: $GITHUB_ENV
|
# github-env: $GITHUB_ENV
|
||||||
- pytorch: linux-cuda-11_7
|
- pytorch: linux-cuda-11_7
|
||||||
os: ubuntu-22.04
|
os: ubuntu-22.04
|
||||||
github-env: $GITHUB_ENV
|
github-env: $GITHUB_ENV
|
||||||
@ -52,14 +52,14 @@ jobs:
|
|||||||
- pytorch: windows-cpu
|
- pytorch: windows-cpu
|
||||||
os: windows-2022
|
os: windows-2022
|
||||||
github-env: $env:GITHUB_ENV
|
github-env: $env:GITHUB_ENV
|
||||||
- pytorch: windows-cuda-11_6
|
# - pytorch: windows-cuda-11_6
|
||||||
os: windows-2022
|
# os: windows-2022
|
||||||
extra-index-url: 'https://download.pytorch.org/whl/cu116'
|
# extra-index-url: 'https://download.pytorch.org/whl/cu116'
|
||||||
github-env: $env:GITHUB_ENV
|
# github-env: $env:GITHUB_ENV
|
||||||
- pytorch: windows-cuda-11_7
|
# - pytorch: windows-cuda-11_7
|
||||||
os: windows-2022
|
# os: windows-2022
|
||||||
extra-index-url: 'https://download.pytorch.org/whl/cu117'
|
# extra-index-url: 'https://download.pytorch.org/whl/cu117'
|
||||||
github-env: $env:GITHUB_ENV
|
# github-env: $env:GITHUB_ENV
|
||||||
name: ${{ matrix.pytorch }} on ${{ matrix.python-version }}
|
name: ${{ matrix.pytorch }} on ${{ matrix.python-version }}
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
steps:
|
steps:
|
||||||
@ -93,9 +93,15 @@ jobs:
|
|||||||
run: echo "TEST_PROMPTS=tests/validate_pr_prompt.txt" >> ${{ matrix.github-env }}
|
run: echo "TEST_PROMPTS=tests/validate_pr_prompt.txt" >> ${{ matrix.github-env }}
|
||||||
|
|
||||||
- name: install invokeai
|
- name: install invokeai
|
||||||
run: pip3 install --use-pep517 -e .
|
|
||||||
env:
|
env:
|
||||||
PIP_EXTRA_INDEX_URL: ${{ matrix.extra-index-url }}
|
PIP_EXTRA_INDEX_URL: ${{ matrix.extra-index-url }}
|
||||||
|
run: >
|
||||||
|
pip3 install
|
||||||
|
--use-pep517
|
||||||
|
--editable=".[test]"
|
||||||
|
|
||||||
|
- name: run pytest
|
||||||
|
run: pytest
|
||||||
|
|
||||||
- name: Use Cached models
|
- name: Use Cached models
|
||||||
id: cache-sd-model
|
id: cache-sd-model
|
||||||
@ -107,12 +113,12 @@ jobs:
|
|||||||
key: ${{ env.cache-name }}
|
key: ${{ env.cache-name }}
|
||||||
enableCrossOsArchive: true
|
enableCrossOsArchive: true
|
||||||
|
|
||||||
- name: run configure_invokeai
|
- name: run invokeai-configure
|
||||||
id: run-preload-models
|
id: run-preload-models
|
||||||
env:
|
env:
|
||||||
HUGGING_FACE_HUB_TOKEN: ${{ secrets.HUGGINGFACE_TOKEN }}
|
HUGGING_FACE_HUB_TOKEN: ${{ secrets.HUGGINGFACE_TOKEN }}
|
||||||
run: >
|
run: >
|
||||||
configure_invokeai
|
invokeai-configure
|
||||||
--yes
|
--yes
|
||||||
--default_only
|
--default_only
|
||||||
--full-precision
|
--full-precision
|
||||||
@ -127,7 +133,7 @@ jobs:
|
|||||||
HF_DATASETS_OFFLINE: 1
|
HF_DATASETS_OFFLINE: 1
|
||||||
TRANSFORMERS_OFFLINE: 1
|
TRANSFORMERS_OFFLINE: 1
|
||||||
run: >
|
run: >
|
||||||
invoke
|
invokeai
|
||||||
--no-patchmatch
|
--no-patchmatch
|
||||||
--no-nsfw_checker
|
--no-nsfw_checker
|
||||||
--from_file ${{ env.TEST_PROMPTS }}
|
--from_file ${{ env.TEST_PROMPTS }}
|
||||||
|
4
.gitignore
vendored
@ -72,6 +72,7 @@ coverage.xml
|
|||||||
.hypothesis/
|
.hypothesis/
|
||||||
.pytest_cache/
|
.pytest_cache/
|
||||||
cover/
|
cover/
|
||||||
|
junit/
|
||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
*.mo
|
*.mo
|
||||||
@ -230,8 +231,5 @@ installer/install.sh
|
|||||||
installer/update.bat
|
installer/update.bat
|
||||||
installer/update.sh
|
installer/update.sh
|
||||||
|
|
||||||
# this may be present if the user created a venv
|
|
||||||
invokeai
|
|
||||||
|
|
||||||
# no longer stored in source directory
|
# no longer stored in source directory
|
||||||
models
|
models
|
@ -1,803 +0,0 @@
|
|||||||
sd-concepts-library/001glitch-core
|
|
||||||
sd-concepts-library/2814-roth
|
|
||||||
sd-concepts-library/3d-female-cyborgs
|
|
||||||
sd-concepts-library/4tnght
|
|
||||||
sd-concepts-library/80s-anime-ai
|
|
||||||
sd-concepts-library/80s-anime-ai-being
|
|
||||||
sd-concepts-library/852style-girl
|
|
||||||
sd-concepts-library/8bit
|
|
||||||
sd-concepts-library/8sconception
|
|
||||||
sd-concepts-library/Aflac-duck
|
|
||||||
sd-concepts-library/Akitsuki
|
|
||||||
sd-concepts-library/Atako
|
|
||||||
sd-concepts-library/Exodus-Styling
|
|
||||||
sd-concepts-library/RINGAO
|
|
||||||
sd-concepts-library/a-female-hero-from-the-legend-of-mir
|
|
||||||
sd-concepts-library/a-hat-kid
|
|
||||||
sd-concepts-library/a-tale-of-two-empires
|
|
||||||
sd-concepts-library/aadhav-face
|
|
||||||
sd-concepts-library/aavegotchi
|
|
||||||
sd-concepts-library/abby-face
|
|
||||||
sd-concepts-library/abstract-concepts
|
|
||||||
sd-concepts-library/accurate-angel
|
|
||||||
sd-concepts-library/agm-style-nao
|
|
||||||
sd-concepts-library/aj-fosik
|
|
||||||
sd-concepts-library/alberto-mielgo
|
|
||||||
sd-concepts-library/alex-portugal
|
|
||||||
sd-concepts-library/alex-thumbnail-object-2000-steps
|
|
||||||
sd-concepts-library/aleyna-tilki
|
|
||||||
sd-concepts-library/alf
|
|
||||||
sd-concepts-library/alicebeta
|
|
||||||
sd-concepts-library/alien-avatar
|
|
||||||
sd-concepts-library/alisa
|
|
||||||
sd-concepts-library/all-rings-albuns
|
|
||||||
sd-concepts-library/altvent
|
|
||||||
sd-concepts-library/altyn-helmet
|
|
||||||
sd-concepts-library/amine
|
|
||||||
sd-concepts-library/amogus
|
|
||||||
sd-concepts-library/anders-zorn
|
|
||||||
sd-concepts-library/angus-mcbride-style
|
|
||||||
sd-concepts-library/animalve3-1500seq
|
|
||||||
sd-concepts-library/anime-background-style
|
|
||||||
sd-concepts-library/anime-background-style-v2
|
|
||||||
sd-concepts-library/anime-boy
|
|
||||||
sd-concepts-library/anime-girl
|
|
||||||
sd-concepts-library/anyXtronXredshift
|
|
||||||
sd-concepts-library/anya-forger
|
|
||||||
sd-concepts-library/apex-wingman
|
|
||||||
sd-concepts-library/apulian-rooster-v0-1
|
|
||||||
sd-concepts-library/arcane-face
|
|
||||||
sd-concepts-library/arcane-style-jv
|
|
||||||
sd-concepts-library/arcimboldo-style
|
|
||||||
sd-concepts-library/armando-reveron-style
|
|
||||||
sd-concepts-library/armor-concept
|
|
||||||
sd-concepts-library/arq-render
|
|
||||||
sd-concepts-library/art-brut
|
|
||||||
sd-concepts-library/arthur1
|
|
||||||
sd-concepts-library/artist-yukiko-kanagai
|
|
||||||
sd-concepts-library/arwijn
|
|
||||||
sd-concepts-library/ashiok
|
|
||||||
sd-concepts-library/at-wolf-boy-object
|
|
||||||
sd-concepts-library/atm-ant
|
|
||||||
sd-concepts-library/atm-ant-2
|
|
||||||
sd-concepts-library/axe-tattoo
|
|
||||||
sd-concepts-library/ayush-spider-spr
|
|
||||||
sd-concepts-library/azura-from-vibrant-venture
|
|
||||||
sd-concepts-library/ba-shiroko
|
|
||||||
sd-concepts-library/babau
|
|
||||||
sd-concepts-library/babs-bunny
|
|
||||||
sd-concepts-library/babushork
|
|
||||||
sd-concepts-library/backrooms
|
|
||||||
sd-concepts-library/bad_Hub_Hugh
|
|
||||||
sd-concepts-library/bada-club
|
|
||||||
sd-concepts-library/baldi
|
|
||||||
sd-concepts-library/baluchitherian
|
|
||||||
sd-concepts-library/bamse
|
|
||||||
sd-concepts-library/bamse-og-kylling
|
|
||||||
sd-concepts-library/bee
|
|
||||||
sd-concepts-library/beholder
|
|
||||||
sd-concepts-library/beldam
|
|
||||||
sd-concepts-library/belen
|
|
||||||
sd-concepts-library/bella-goth
|
|
||||||
sd-concepts-library/belle-delphine
|
|
||||||
sd-concepts-library/bert-muppet
|
|
||||||
sd-concepts-library/better-collage3
|
|
||||||
sd-concepts-library/between2-mt-fade
|
|
||||||
sd-concepts-library/birb-style
|
|
||||||
sd-concepts-library/black-and-white-design
|
|
||||||
sd-concepts-library/black-waifu
|
|
||||||
sd-concepts-library/bloo
|
|
||||||
sd-concepts-library/blue-haired-boy
|
|
||||||
sd-concepts-library/blue-zombie
|
|
||||||
sd-concepts-library/blue-zombiee
|
|
||||||
sd-concepts-library/bluebey
|
|
||||||
sd-concepts-library/bluebey-2
|
|
||||||
sd-concepts-library/bobs-burgers
|
|
||||||
sd-concepts-library/boissonnard
|
|
||||||
sd-concepts-library/bonzi-monkey
|
|
||||||
sd-concepts-library/borderlands
|
|
||||||
sd-concepts-library/bored-ape-textual-inversion
|
|
||||||
sd-concepts-library/boris-anderson
|
|
||||||
sd-concepts-library/bozo-22
|
|
||||||
sd-concepts-library/breakcore
|
|
||||||
sd-concepts-library/brittney-williams-art
|
|
||||||
sd-concepts-library/bruma
|
|
||||||
sd-concepts-library/brunnya
|
|
||||||
sd-concepts-library/buddha-statue
|
|
||||||
sd-concepts-library/bullvbear
|
|
||||||
sd-concepts-library/button-eyes
|
|
||||||
sd-concepts-library/canadian-goose
|
|
||||||
sd-concepts-library/canary-cap
|
|
||||||
sd-concepts-library/cancer_style
|
|
||||||
sd-concepts-library/captain-haddock
|
|
||||||
sd-concepts-library/captainkirb
|
|
||||||
sd-concepts-library/car-toy-rk
|
|
||||||
sd-concepts-library/carasibana
|
|
||||||
sd-concepts-library/carlitos-el-mago
|
|
||||||
sd-concepts-library/carrascharacter
|
|
||||||
sd-concepts-library/cartoona-animals
|
|
||||||
sd-concepts-library/cat-toy
|
|
||||||
sd-concepts-library/centaur
|
|
||||||
sd-concepts-library/cgdonny1
|
|
||||||
sd-concepts-library/cham
|
|
||||||
sd-concepts-library/chandra-nalaar
|
|
||||||
sd-concepts-library/char-con
|
|
||||||
sd-concepts-library/character-pingu
|
|
||||||
sd-concepts-library/cheburashka
|
|
||||||
sd-concepts-library/chen-1
|
|
||||||
sd-concepts-library/child-zombie
|
|
||||||
sd-concepts-library/chillpill
|
|
||||||
sd-concepts-library/chonkfrog
|
|
||||||
sd-concepts-library/chop
|
|
||||||
sd-concepts-library/christo-person
|
|
||||||
sd-concepts-library/chuck-walton
|
|
||||||
sd-concepts-library/chucky
|
|
||||||
sd-concepts-library/chungus-poodl-pet
|
|
||||||
sd-concepts-library/cindlop
|
|
||||||
sd-concepts-library/collage-cutouts
|
|
||||||
sd-concepts-library/collage14
|
|
||||||
sd-concepts-library/collage3
|
|
||||||
sd-concepts-library/collage3-hubcity
|
|
||||||
sd-concepts-library/cologne
|
|
||||||
sd-concepts-library/color-page
|
|
||||||
sd-concepts-library/colossus
|
|
||||||
sd-concepts-library/command-and-conquer-remastered-cameos
|
|
||||||
sd-concepts-library/concept-art
|
|
||||||
sd-concepts-library/conner-fawcett-style
|
|
||||||
sd-concepts-library/conway-pirate
|
|
||||||
sd-concepts-library/coop-himmelblau
|
|
||||||
sd-concepts-library/coraline
|
|
||||||
sd-concepts-library/cornell-box
|
|
||||||
sd-concepts-library/cortana
|
|
||||||
sd-concepts-library/covid-19-rapid-test
|
|
||||||
sd-concepts-library/cow-uwu
|
|
||||||
sd-concepts-library/cowboy
|
|
||||||
sd-concepts-library/crazy-1
|
|
||||||
sd-concepts-library/crazy-2
|
|
||||||
sd-concepts-library/crb-portraits
|
|
||||||
sd-concepts-library/crb-surrealz
|
|
||||||
sd-concepts-library/crbart
|
|
||||||
sd-concepts-library/crested-gecko
|
|
||||||
sd-concepts-library/crinos-form-garou
|
|
||||||
sd-concepts-library/cry-baby-style
|
|
||||||
sd-concepts-library/crybaby-style-2-0
|
|
||||||
sd-concepts-library/csgo-awp-object
|
|
||||||
sd-concepts-library/csgo-awp-texture-map
|
|
||||||
sd-concepts-library/cubex
|
|
||||||
sd-concepts-library/cumbia-peruana
|
|
||||||
sd-concepts-library/cute-bear
|
|
||||||
sd-concepts-library/cute-cat
|
|
||||||
sd-concepts-library/cute-game-style
|
|
||||||
sd-concepts-library/cyberpunk-lucy
|
|
||||||
sd-concepts-library/dabotap
|
|
||||||
sd-concepts-library/dan-mumford
|
|
||||||
sd-concepts-library/dan-seagrave-art-style
|
|
||||||
sd-concepts-library/dark-penguin-pinguinanimations
|
|
||||||
sd-concepts-library/darkpenguinanimatronic
|
|
||||||
sd-concepts-library/darkplane
|
|
||||||
sd-concepts-library/david-firth-artstyle
|
|
||||||
sd-concepts-library/david-martinez-cyberpunk
|
|
||||||
sd-concepts-library/david-martinez-edgerunners
|
|
||||||
sd-concepts-library/david-moreno-architecture
|
|
||||||
sd-concepts-library/daycare-attendant-sun-fnaf
|
|
||||||
sd-concepts-library/ddattender
|
|
||||||
sd-concepts-library/degods
|
|
||||||
sd-concepts-library/degodsheavy
|
|
||||||
sd-concepts-library/depthmap
|
|
||||||
sd-concepts-library/depthmap-style
|
|
||||||
sd-concepts-library/design
|
|
||||||
sd-concepts-library/detectivedinosaur1
|
|
||||||
sd-concepts-library/diaosu-toy
|
|
||||||
sd-concepts-library/dicoo
|
|
||||||
sd-concepts-library/dicoo2
|
|
||||||
sd-concepts-library/dishonored-portrait-styles
|
|
||||||
sd-concepts-library/disquieting-muses
|
|
||||||
sd-concepts-library/ditko
|
|
||||||
sd-concepts-library/dlooak
|
|
||||||
sd-concepts-library/doc
|
|
||||||
sd-concepts-library/doener-red-line-art
|
|
||||||
sd-concepts-library/dog
|
|
||||||
sd-concepts-library/dog-django
|
|
||||||
sd-concepts-library/doge-pound
|
|
||||||
sd-concepts-library/dong-ho
|
|
||||||
sd-concepts-library/dong-ho2
|
|
||||||
sd-concepts-library/doose-s-realistic-art-style
|
|
||||||
sd-concepts-library/dq10-anrushia
|
|
||||||
sd-concepts-library/dr-livesey
|
|
||||||
sd-concepts-library/dr-strange
|
|
||||||
sd-concepts-library/dragonborn
|
|
||||||
sd-concepts-library/dreamcore
|
|
||||||
sd-concepts-library/dreamy-painting
|
|
||||||
sd-concepts-library/drive-scorpion-jacket
|
|
||||||
sd-concepts-library/dsmuses
|
|
||||||
sd-concepts-library/dtv-pkmn
|
|
||||||
sd-concepts-library/dullboy-caricature
|
|
||||||
sd-concepts-library/duranduran
|
|
||||||
sd-concepts-library/durer-style
|
|
||||||
sd-concepts-library/dyoudim-style
|
|
||||||
sd-concepts-library/early-mishima-kurone
|
|
||||||
sd-concepts-library/eastward
|
|
||||||
sd-concepts-library/eddie
|
|
||||||
sd-concepts-library/edgerunners-style
|
|
||||||
sd-concepts-library/edgerunners-style-v2
|
|
||||||
sd-concepts-library/el-salvador-style-style
|
|
||||||
sd-concepts-library/elegant-flower
|
|
||||||
sd-concepts-library/elspeth-tirel
|
|
||||||
sd-concepts-library/eru-chitanda-casual
|
|
||||||
sd-concepts-library/erwin-olaf-style
|
|
||||||
sd-concepts-library/ettblackteapot
|
|
||||||
sd-concepts-library/explosions-cat
|
|
||||||
sd-concepts-library/eye-of-agamotto
|
|
||||||
sd-concepts-library/f-22
|
|
||||||
sd-concepts-library/facadeplace
|
|
||||||
sd-concepts-library/fairy-tale-painting-style
|
|
||||||
sd-concepts-library/fairytale
|
|
||||||
sd-concepts-library/fang-yuan-001
|
|
||||||
sd-concepts-library/faraon-love-shady
|
|
||||||
sd-concepts-library/fasina
|
|
||||||
sd-concepts-library/felps
|
|
||||||
sd-concepts-library/female-kpop-singer
|
|
||||||
sd-concepts-library/fergal-cat
|
|
||||||
sd-concepts-library/filename-2
|
|
||||||
sd-concepts-library/fileteado-porteno
|
|
||||||
sd-concepts-library/final-fantasy-logo
|
|
||||||
sd-concepts-library/fireworks-over-water
|
|
||||||
sd-concepts-library/fish
|
|
||||||
sd-concepts-library/flag-ussr
|
|
||||||
sd-concepts-library/flatic
|
|
||||||
sd-concepts-library/floral
|
|
||||||
sd-concepts-library/fluid-acrylic-jellyfish-creatures-style-of-carl-ingram-art
|
|
||||||
sd-concepts-library/fnf-boyfriend
|
|
||||||
sd-concepts-library/fold-structure
|
|
||||||
sd-concepts-library/fox-purple
|
|
||||||
sd-concepts-library/fractal
|
|
||||||
sd-concepts-library/fractal-flame
|
|
||||||
sd-concepts-library/fractal-temple-style
|
|
||||||
sd-concepts-library/frank-frazetta
|
|
||||||
sd-concepts-library/franz-unterberger
|
|
||||||
sd-concepts-library/freddy-fazbear
|
|
||||||
sd-concepts-library/freefonix-style
|
|
||||||
sd-concepts-library/furrpopasthetic
|
|
||||||
sd-concepts-library/fursona
|
|
||||||
sd-concepts-library/fzk
|
|
||||||
sd-concepts-library/galaxy-explorer
|
|
||||||
sd-concepts-library/ganyu-genshin-impact
|
|
||||||
sd-concepts-library/garcon-the-cat
|
|
||||||
sd-concepts-library/garfield-pizza-plush
|
|
||||||
sd-concepts-library/garfield-pizza-plush-v2
|
|
||||||
sd-concepts-library/gba-fe-class-cards
|
|
||||||
sd-concepts-library/gba-pokemon-sprites
|
|
||||||
sd-concepts-library/geggin
|
|
||||||
sd-concepts-library/ggplot2
|
|
||||||
sd-concepts-library/ghost-style
|
|
||||||
sd-concepts-library/ghostproject-men
|
|
||||||
sd-concepts-library/gibasachan-v0
|
|
||||||
sd-concepts-library/gim
|
|
||||||
sd-concepts-library/gio
|
|
||||||
sd-concepts-library/giygas
|
|
||||||
sd-concepts-library/glass-pipe
|
|
||||||
sd-concepts-library/glass-prism-cube
|
|
||||||
sd-concepts-library/glow-forest
|
|
||||||
sd-concepts-library/goku
|
|
||||||
sd-concepts-library/gram-tops
|
|
||||||
sd-concepts-library/green-blue-shanshui
|
|
||||||
sd-concepts-library/green-tent
|
|
||||||
sd-concepts-library/grifter
|
|
||||||
sd-concepts-library/grisstyle
|
|
||||||
sd-concepts-library/grit-toy
|
|
||||||
sd-concepts-library/gt-color-paint-2
|
|
||||||
sd-concepts-library/gta5-artwork
|
|
||||||
sd-concepts-library/guttestreker
|
|
||||||
sd-concepts-library/gymnastics-leotard-v2
|
|
||||||
sd-concepts-library/half-life-2-dog
|
|
||||||
sd-concepts-library/handstand
|
|
||||||
sd-concepts-library/hanfu-anime-style
|
|
||||||
sd-concepts-library/happy-chaos
|
|
||||||
sd-concepts-library/happy-person12345
|
|
||||||
sd-concepts-library/happy-person12345-assets
|
|
||||||
sd-concepts-library/harley-quinn
|
|
||||||
sd-concepts-library/harmless-ai-1
|
|
||||||
sd-concepts-library/harmless-ai-house-style-1
|
|
||||||
sd-concepts-library/hd-emoji
|
|
||||||
sd-concepts-library/heather
|
|
||||||
sd-concepts-library/henjo-techno-show
|
|
||||||
sd-concepts-library/herge-style
|
|
||||||
sd-concepts-library/hiten-style-nao
|
|
||||||
sd-concepts-library/hitokomoru-style-nao
|
|
||||||
sd-concepts-library/hiyuki-chan
|
|
||||||
sd-concepts-library/hk-bamboo
|
|
||||||
sd-concepts-library/hk-betweenislands
|
|
||||||
sd-concepts-library/hk-bicycle
|
|
||||||
sd-concepts-library/hk-blackandwhite
|
|
||||||
sd-concepts-library/hk-breakfast
|
|
||||||
sd-concepts-library/hk-buses
|
|
||||||
sd-concepts-library/hk-clouds
|
|
||||||
sd-concepts-library/hk-goldbuddha
|
|
||||||
sd-concepts-library/hk-goldenlantern
|
|
||||||
sd-concepts-library/hk-hkisland
|
|
||||||
sd-concepts-library/hk-leaves
|
|
||||||
sd-concepts-library/hk-market
|
|
||||||
sd-concepts-library/hk-oldcamera
|
|
||||||
sd-concepts-library/hk-opencamera
|
|
||||||
sd-concepts-library/hk-peach
|
|
||||||
sd-concepts-library/hk-phonevax
|
|
||||||
sd-concepts-library/hk-streetpeople
|
|
||||||
sd-concepts-library/hk-vintage
|
|
||||||
sd-concepts-library/hoi4
|
|
||||||
sd-concepts-library/hoi4-leaders
|
|
||||||
sd-concepts-library/homestuck-sprite
|
|
||||||
sd-concepts-library/homestuck-troll
|
|
||||||
sd-concepts-library/hours-sentry-fade
|
|
||||||
sd-concepts-library/hours-style
|
|
||||||
sd-concepts-library/hrgiger-drmacabre
|
|
||||||
sd-concepts-library/huang-guang-jian
|
|
||||||
sd-concepts-library/huatli
|
|
||||||
sd-concepts-library/huayecai820-greyscale
|
|
||||||
sd-concepts-library/hub-city
|
|
||||||
sd-concepts-library/hubris-oshri
|
|
||||||
sd-concepts-library/huckleberry
|
|
||||||
sd-concepts-library/hydrasuit
|
|
||||||
sd-concepts-library/i-love-chaos
|
|
||||||
sd-concepts-library/ibere-thenorio
|
|
||||||
sd-concepts-library/ic0n
|
|
||||||
sd-concepts-library/ie-gravestone
|
|
||||||
sd-concepts-library/ikea-fabler
|
|
||||||
sd-concepts-library/illustration-style
|
|
||||||
sd-concepts-library/ilo-kunst
|
|
||||||
sd-concepts-library/ilya-shkipin
|
|
||||||
sd-concepts-library/im-poppy
|
|
||||||
sd-concepts-library/ina-art
|
|
||||||
sd-concepts-library/indian-watercolor-portraits
|
|
||||||
sd-concepts-library/indiana
|
|
||||||
sd-concepts-library/ingmar-bergman
|
|
||||||
sd-concepts-library/insidewhale
|
|
||||||
sd-concepts-library/interchanges
|
|
||||||
sd-concepts-library/inuyama-muneto-style-nao
|
|
||||||
sd-concepts-library/irasutoya
|
|
||||||
sd-concepts-library/iridescent-illustration-style
|
|
||||||
sd-concepts-library/iridescent-photo-style
|
|
||||||
sd-concepts-library/isabell-schulte-pv-pvii-3000steps
|
|
||||||
sd-concepts-library/isabell-schulte-pviii-1-image-style
|
|
||||||
sd-concepts-library/isabell-schulte-pviii-1024px-1500-steps-style
|
|
||||||
sd-concepts-library/isabell-schulte-pviii-12tiles-3000steps-style
|
|
||||||
sd-concepts-library/isabell-schulte-pviii-4-tiles-1-lr-3000-steps-style
|
|
||||||
sd-concepts-library/isabell-schulte-pviii-4-tiles-3-lr-5000-steps-style
|
|
||||||
sd-concepts-library/isabell-schulte-pviii-4tiles-500steps
|
|
||||||
sd-concepts-library/isabell-schulte-pviii-4tiles-6000steps
|
|
||||||
sd-concepts-library/isabell-schulte-pviii-style
|
|
||||||
sd-concepts-library/isometric-tile-test
|
|
||||||
sd-concepts-library/jacqueline-the-unicorn
|
|
||||||
sd-concepts-library/james-web-space-telescope
|
|
||||||
sd-concepts-library/jamie-hewlett-style
|
|
||||||
sd-concepts-library/jamiels
|
|
||||||
sd-concepts-library/jang-sung-rak-style
|
|
||||||
sd-concepts-library/jetsetdreamcastcovers
|
|
||||||
sd-concepts-library/jin-kisaragi
|
|
||||||
sd-concepts-library/jinjoon-lee-they
|
|
||||||
sd-concepts-library/jm-bergling-monogram
|
|
||||||
sd-concepts-library/joe-mad
|
|
||||||
sd-concepts-library/joe-whiteford-art-style
|
|
||||||
sd-concepts-library/joemad
|
|
||||||
sd-concepts-library/john-blanche
|
|
||||||
sd-concepts-library/johnny-silverhand
|
|
||||||
sd-concepts-library/jojo-bizzare-adventure-manga-lineart
|
|
||||||
sd-concepts-library/jos-de-kat
|
|
||||||
sd-concepts-library/junji-ito-artstyle
|
|
||||||
sd-concepts-library/kaleido
|
|
||||||
sd-concepts-library/kaneoya-sachiko
|
|
||||||
sd-concepts-library/kanovt
|
|
||||||
sd-concepts-library/kanv1
|
|
||||||
sd-concepts-library/karan-gloomy
|
|
||||||
sd-concepts-library/karl-s-lzx-1
|
|
||||||
sd-concepts-library/kasumin
|
|
||||||
sd-concepts-library/kawaii-colors
|
|
||||||
sd-concepts-library/kawaii-girl-plus-object
|
|
||||||
sd-concepts-library/kawaii-girl-plus-style
|
|
||||||
sd-concepts-library/kawaii-girl-plus-style-v1-1
|
|
||||||
sd-concepts-library/kay
|
|
||||||
sd-concepts-library/kaya-ghost-assasin
|
|
||||||
sd-concepts-library/ki
|
|
||||||
sd-concepts-library/kinda-sus
|
|
||||||
sd-concepts-library/kings-quest-agd
|
|
||||||
sd-concepts-library/kiora
|
|
||||||
sd-concepts-library/kira-sensei
|
|
||||||
sd-concepts-library/kirby
|
|
||||||
sd-concepts-library/klance
|
|
||||||
sd-concepts-library/kodakvision500t
|
|
||||||
sd-concepts-library/kogatan-shiny
|
|
||||||
sd-concepts-library/kogecha
|
|
||||||
sd-concepts-library/kojima-ayami
|
|
||||||
sd-concepts-library/koko-dog
|
|
||||||
sd-concepts-library/kuvshinov
|
|
||||||
sd-concepts-library/kysa-v-style
|
|
||||||
sd-concepts-library/laala-character
|
|
||||||
sd-concepts-library/larrette
|
|
||||||
sd-concepts-library/lavko
|
|
||||||
sd-concepts-library/lazytown-stephanie
|
|
||||||
sd-concepts-library/ldr
|
|
||||||
sd-concepts-library/ldrs
|
|
||||||
sd-concepts-library/led-toy
|
|
||||||
sd-concepts-library/lego-astronaut
|
|
||||||
sd-concepts-library/leica
|
|
||||||
sd-concepts-library/leif-jones
|
|
||||||
sd-concepts-library/lex
|
|
||||||
sd-concepts-library/liliana
|
|
||||||
sd-concepts-library/liliana-vess
|
|
||||||
sd-concepts-library/liminal-spaces-2-0
|
|
||||||
sd-concepts-library/liminalspaces
|
|
||||||
sd-concepts-library/line-art
|
|
||||||
sd-concepts-library/line-style
|
|
||||||
sd-concepts-library/linnopoke
|
|
||||||
sd-concepts-library/liquid-light
|
|
||||||
sd-concepts-library/liqwid-aquafarmer
|
|
||||||
sd-concepts-library/lizardman
|
|
||||||
sd-concepts-library/loab-character
|
|
||||||
sd-concepts-library/loab-style
|
|
||||||
sd-concepts-library/lofa
|
|
||||||
sd-concepts-library/logo-with-face-on-shield
|
|
||||||
sd-concepts-library/lolo
|
|
||||||
sd-concepts-library/looney-anime
|
|
||||||
sd-concepts-library/lost-rapper
|
|
||||||
sd-concepts-library/lphr-style
|
|
||||||
sd-concepts-library/lucario
|
|
||||||
sd-concepts-library/lucky-luke
|
|
||||||
sd-concepts-library/lugal-ki-en
|
|
||||||
sd-concepts-library/luinv2
|
|
||||||
sd-concepts-library/lula-13
|
|
||||||
sd-concepts-library/lumio
|
|
||||||
sd-concepts-library/lxj-o4
|
|
||||||
sd-concepts-library/m-geo
|
|
||||||
sd-concepts-library/m-geoo
|
|
||||||
sd-concepts-library/madhubani-art
|
|
||||||
sd-concepts-library/mafalda-character
|
|
||||||
sd-concepts-library/magic-pengel
|
|
||||||
sd-concepts-library/malika-favre-art-style
|
|
||||||
sd-concepts-library/manga-style
|
|
||||||
sd-concepts-library/marbling-art
|
|
||||||
sd-concepts-library/margo
|
|
||||||
sd-concepts-library/marty
|
|
||||||
sd-concepts-library/marty6
|
|
||||||
sd-concepts-library/mass
|
|
||||||
sd-concepts-library/masyanya
|
|
||||||
sd-concepts-library/masyunya
|
|
||||||
sd-concepts-library/mate
|
|
||||||
sd-concepts-library/matthew-stone
|
|
||||||
sd-concepts-library/mattvidpro
|
|
||||||
sd-concepts-library/maurice-quentin-de-la-tour-style
|
|
||||||
sd-concepts-library/maus
|
|
||||||
sd-concepts-library/max-foley
|
|
||||||
sd-concepts-library/mayor-richard-irvin
|
|
||||||
sd-concepts-library/mechasoulall
|
|
||||||
sd-concepts-library/medazzaland
|
|
||||||
sd-concepts-library/memnarch-mtg
|
|
||||||
sd-concepts-library/metagabe
|
|
||||||
sd-concepts-library/meyoco
|
|
||||||
sd-concepts-library/meze-audio-elite-headphones
|
|
||||||
sd-concepts-library/midjourney-style
|
|
||||||
sd-concepts-library/mikako-method
|
|
||||||
sd-concepts-library/mikako-methodi2i
|
|
||||||
sd-concepts-library/miko-3-robot
|
|
||||||
sd-concepts-library/milady
|
|
||||||
sd-concepts-library/mildemelwe-style
|
|
||||||
sd-concepts-library/million-live-akane-15k
|
|
||||||
sd-concepts-library/million-live-akane-3k
|
|
||||||
sd-concepts-library/million-live-akane-shifuku-3k
|
|
||||||
sd-concepts-library/million-live-spade-q-object-3k
|
|
||||||
sd-concepts-library/million-live-spade-q-style-3k
|
|
||||||
sd-concepts-library/minecraft-concept-art
|
|
||||||
sd-concepts-library/mishima-kurone
|
|
||||||
sd-concepts-library/mizkif
|
|
||||||
sd-concepts-library/moeb-style
|
|
||||||
sd-concepts-library/moebius
|
|
||||||
sd-concepts-library/mokoko
|
|
||||||
sd-concepts-library/mokoko-seed
|
|
||||||
sd-concepts-library/monster-girl
|
|
||||||
sd-concepts-library/monster-toy
|
|
||||||
sd-concepts-library/monte-novo
|
|
||||||
sd-concepts-library/moo-moo
|
|
||||||
sd-concepts-library/morino-hon-style
|
|
||||||
sd-concepts-library/moxxi
|
|
||||||
sd-concepts-library/msg
|
|
||||||
sd-concepts-library/mtg-card
|
|
||||||
sd-concepts-library/mtl-longsky
|
|
||||||
sd-concepts-library/mu-sadr
|
|
||||||
sd-concepts-library/munch-leaks-style
|
|
||||||
sd-concepts-library/museum-by-coop-himmelblau
|
|
||||||
sd-concepts-library/muxoyara
|
|
||||||
sd-concepts-library/my-hero-academia-style
|
|
||||||
sd-concepts-library/my-mug
|
|
||||||
sd-concepts-library/mycat
|
|
||||||
sd-concepts-library/mystical-nature
|
|
||||||
sd-concepts-library/naf
|
|
||||||
sd-concepts-library/nahiri
|
|
||||||
sd-concepts-library/namine-ritsu
|
|
||||||
sd-concepts-library/naoki-saito
|
|
||||||
sd-concepts-library/nard-style
|
|
||||||
sd-concepts-library/naruto
|
|
||||||
sd-concepts-library/natasha-johnston
|
|
||||||
sd-concepts-library/nathan-wyatt
|
|
||||||
sd-concepts-library/naval-portrait
|
|
||||||
sd-concepts-library/nazuna
|
|
||||||
sd-concepts-library/nebula
|
|
||||||
sd-concepts-library/ned-flanders
|
|
||||||
sd-concepts-library/neon-pastel
|
|
||||||
sd-concepts-library/new-priests
|
|
||||||
sd-concepts-library/nic-papercuts
|
|
||||||
sd-concepts-library/nikodim
|
|
||||||
sd-concepts-library/nissa-revane
|
|
||||||
sd-concepts-library/nixeu
|
|
||||||
sd-concepts-library/noggles
|
|
||||||
sd-concepts-library/nomad
|
|
||||||
sd-concepts-library/nouns-glasses
|
|
||||||
sd-concepts-library/obama-based-on-xi
|
|
||||||
sd-concepts-library/obama-self-2
|
|
||||||
sd-concepts-library/og-mox-style
|
|
||||||
sd-concepts-library/ohisashiburi-style
|
|
||||||
sd-concepts-library/oleg-kuvaev
|
|
||||||
sd-concepts-library/olli-olli
|
|
||||||
sd-concepts-library/on-kawara
|
|
||||||
sd-concepts-library/one-line-drawing
|
|
||||||
sd-concepts-library/onepunchman
|
|
||||||
sd-concepts-library/onzpo
|
|
||||||
sd-concepts-library/orangejacket
|
|
||||||
sd-concepts-library/ori
|
|
||||||
sd-concepts-library/ori-toor
|
|
||||||
sd-concepts-library/orientalist-art
|
|
||||||
sd-concepts-library/osaka-jyo
|
|
||||||
sd-concepts-library/osaka-jyo2
|
|
||||||
sd-concepts-library/osrsmini2
|
|
||||||
sd-concepts-library/osrstiny
|
|
||||||
sd-concepts-library/other-mother
|
|
||||||
sd-concepts-library/ouroboros
|
|
||||||
sd-concepts-library/outfit-items
|
|
||||||
sd-concepts-library/overprettified
|
|
||||||
sd-concepts-library/owl-house
|
|
||||||
sd-concepts-library/painted-by-silver-of-999
|
|
||||||
sd-concepts-library/painted-by-silver-of-999-2
|
|
||||||
sd-concepts-library/painted-student
|
|
||||||
sd-concepts-library/painting
|
|
||||||
sd-concepts-library/pantone-milk
|
|
||||||
sd-concepts-library/paolo-bonolis
|
|
||||||
sd-concepts-library/party-girl
|
|
||||||
sd-concepts-library/pascalsibertin
|
|
||||||
sd-concepts-library/pastelartstyle
|
|
||||||
sd-concepts-library/paul-noir
|
|
||||||
sd-concepts-library/pen-ink-portraits-bennorthen
|
|
||||||
sd-concepts-library/phan
|
|
||||||
sd-concepts-library/phan-s-collage
|
|
||||||
sd-concepts-library/phc
|
|
||||||
sd-concepts-library/phoenix-01
|
|
||||||
sd-concepts-library/pineda-david
|
|
||||||
sd-concepts-library/pink-beast-pastelae-style
|
|
||||||
sd-concepts-library/pintu
|
|
||||||
sd-concepts-library/pion-by-august-semionov
|
|
||||||
sd-concepts-library/piotr-jablonski
|
|
||||||
sd-concepts-library/pixel-mania
|
|
||||||
sd-concepts-library/pixel-toy
|
|
||||||
sd-concepts-library/pjablonski-style
|
|
||||||
sd-concepts-library/plant-style
|
|
||||||
sd-concepts-library/plen-ki-mun
|
|
||||||
sd-concepts-library/pokemon-conquest-sprites
|
|
||||||
sd-concepts-library/pool-test
|
|
||||||
sd-concepts-library/poolrooms
|
|
||||||
sd-concepts-library/poring-ragnarok-online
|
|
||||||
sd-concepts-library/poutine-dish
|
|
||||||
sd-concepts-library/princess-knight-art
|
|
||||||
sd-concepts-library/progress-chip
|
|
||||||
sd-concepts-library/puerquis-toy
|
|
||||||
sd-concepts-library/purplefishli
|
|
||||||
sd-concepts-library/pyramidheadcosplay
|
|
||||||
sd-concepts-library/qpt-atrium
|
|
||||||
sd-concepts-library/quiesel
|
|
||||||
sd-concepts-library/r-crumb-style
|
|
||||||
sd-concepts-library/rahkshi-bionicle
|
|
||||||
sd-concepts-library/raichu
|
|
||||||
sd-concepts-library/rail-scene
|
|
||||||
sd-concepts-library/rail-scene-style
|
|
||||||
sd-concepts-library/ralph-mcquarrie
|
|
||||||
sd-concepts-library/ransom
|
|
||||||
sd-concepts-library/rayne-weynolds
|
|
||||||
sd-concepts-library/rcrumb-portraits-style
|
|
||||||
sd-concepts-library/rd-chaos
|
|
||||||
sd-concepts-library/rd-paintings
|
|
||||||
sd-concepts-library/red-glasses
|
|
||||||
sd-concepts-library/reeducation-camp
|
|
||||||
sd-concepts-library/reksio-dog
|
|
||||||
sd-concepts-library/rektguy
|
|
||||||
sd-concepts-library/remert
|
|
||||||
sd-concepts-library/renalla
|
|
||||||
sd-concepts-library/repeat
|
|
||||||
sd-concepts-library/retro-girl
|
|
||||||
sd-concepts-library/retro-mecha-rangers
|
|
||||||
sd-concepts-library/retropixelart-pinguin
|
|
||||||
sd-concepts-library/rex-deno
|
|
||||||
sd-concepts-library/rhizomuse-machine-bionic-sculpture
|
|
||||||
sd-concepts-library/ricar
|
|
||||||
sd-concepts-library/rickyart
|
|
||||||
sd-concepts-library/rico-face
|
|
||||||
sd-concepts-library/riker-doll
|
|
||||||
sd-concepts-library/rikiart
|
|
||||||
sd-concepts-library/rikiboy-art
|
|
||||||
sd-concepts-library/rilakkuma
|
|
||||||
sd-concepts-library/rishusei-style
|
|
||||||
sd-concepts-library/rj-palmer
|
|
||||||
sd-concepts-library/rl-pkmn-test
|
|
||||||
sd-concepts-library/road-to-ruin
|
|
||||||
sd-concepts-library/robertnava
|
|
||||||
sd-concepts-library/roblox-avatar
|
|
||||||
sd-concepts-library/roy-lichtenstein
|
|
||||||
sd-concepts-library/ruan-jia
|
|
||||||
sd-concepts-library/russian
|
|
||||||
sd-concepts-library/s1m-naoto-ohshima
|
|
||||||
sd-concepts-library/saheeli-rai
|
|
||||||
sd-concepts-library/sakimi-style
|
|
||||||
sd-concepts-library/salmonid
|
|
||||||
sd-concepts-library/sam-yang
|
|
||||||
sd-concepts-library/sanguo-guanyu
|
|
||||||
sd-concepts-library/sas-style
|
|
||||||
sd-concepts-library/scarlet-witch
|
|
||||||
sd-concepts-library/schloss-mosigkau
|
|
||||||
sd-concepts-library/scrap-style
|
|
||||||
sd-concepts-library/scratch-project
|
|
||||||
sd-concepts-library/sculptural-style
|
|
||||||
sd-concepts-library/sd-concepts-library-uma-meme
|
|
||||||
sd-concepts-library/seamless-ground
|
|
||||||
sd-concepts-library/selezneva-alisa
|
|
||||||
sd-concepts-library/sem-mac2n
|
|
||||||
sd-concepts-library/senneca
|
|
||||||
sd-concepts-library/seraphimmoonshadow-art
|
|
||||||
sd-concepts-library/sewerslvt
|
|
||||||
sd-concepts-library/she-hulk-law-art
|
|
||||||
sd-concepts-library/she-mask
|
|
||||||
sd-concepts-library/sherhook-painting
|
|
||||||
sd-concepts-library/sherhook-painting-v2
|
|
||||||
sd-concepts-library/shev-linocut
|
|
||||||
sd-concepts-library/shigure-ui-style
|
|
||||||
sd-concepts-library/shiny-polyman
|
|
||||||
sd-concepts-library/shrunken-head
|
|
||||||
sd-concepts-library/shu-doll
|
|
||||||
sd-concepts-library/shvoren-style
|
|
||||||
sd-concepts-library/sims-2-portrait
|
|
||||||
sd-concepts-library/singsing
|
|
||||||
sd-concepts-library/singsing-doll
|
|
||||||
sd-concepts-library/sintez-ico
|
|
||||||
sd-concepts-library/skyfalls
|
|
||||||
sd-concepts-library/slm
|
|
||||||
sd-concepts-library/smarties
|
|
||||||
sd-concepts-library/smiling-friend-style
|
|
||||||
sd-concepts-library/smooth-pencils
|
|
||||||
sd-concepts-library/smurf-style
|
|
||||||
sd-concepts-library/smw-map
|
|
||||||
sd-concepts-library/society-finch
|
|
||||||
sd-concepts-library/sorami-style
|
|
||||||
sd-concepts-library/spider-gwen
|
|
||||||
sd-concepts-library/spritual-monsters
|
|
||||||
sd-concepts-library/stable-diffusion-conceptualizer
|
|
||||||
sd-concepts-library/star-tours-posters
|
|
||||||
sd-concepts-library/stardew-valley-pixel-art
|
|
||||||
sd-concepts-library/starhavenmachinegods
|
|
||||||
sd-concepts-library/sterling-archer
|
|
||||||
sd-concepts-library/stretch-re1-robot
|
|
||||||
sd-concepts-library/stuffed-penguin-toy
|
|
||||||
sd-concepts-library/style-of-marc-allante
|
|
||||||
sd-concepts-library/summie-style
|
|
||||||
sd-concepts-library/sunfish
|
|
||||||
sd-concepts-library/super-nintendo-cartridge
|
|
||||||
sd-concepts-library/supitcha-mask
|
|
||||||
sd-concepts-library/sushi-pixel
|
|
||||||
sd-concepts-library/swamp-choe-2
|
|
||||||
sd-concepts-library/t-skrang
|
|
||||||
sd-concepts-library/takuji-kawano
|
|
||||||
sd-concepts-library/tamiyo
|
|
||||||
sd-concepts-library/tangles
|
|
||||||
sd-concepts-library/tb303
|
|
||||||
sd-concepts-library/tcirle
|
|
||||||
sd-concepts-library/teelip-ir-landscape
|
|
||||||
sd-concepts-library/teferi
|
|
||||||
sd-concepts-library/tela-lenca
|
|
||||||
sd-concepts-library/tela-lenca2
|
|
||||||
sd-concepts-library/terraria-style
|
|
||||||
sd-concepts-library/tesla-bot
|
|
||||||
sd-concepts-library/test
|
|
||||||
sd-concepts-library/test-epson
|
|
||||||
sd-concepts-library/test2
|
|
||||||
sd-concepts-library/testing
|
|
||||||
sd-concepts-library/thalasin
|
|
||||||
sd-concepts-library/thegeneral
|
|
||||||
sd-concepts-library/thorneworks
|
|
||||||
sd-concepts-library/threestooges
|
|
||||||
sd-concepts-library/thunderdome-cover
|
|
||||||
sd-concepts-library/thunderdome-covers
|
|
||||||
sd-concepts-library/ti-junglepunk-v0
|
|
||||||
sd-concepts-library/tili-concept
|
|
||||||
sd-concepts-library/titan-robot
|
|
||||||
sd-concepts-library/tnj
|
|
||||||
sd-concepts-library/toho-pixel
|
|
||||||
sd-concepts-library/tomcat
|
|
||||||
sd-concepts-library/tonal1
|
|
||||||
sd-concepts-library/tony-diterlizzi-s-planescape-art
|
|
||||||
sd-concepts-library/towerplace
|
|
||||||
sd-concepts-library/toy
|
|
||||||
sd-concepts-library/toy-bonnie-plush
|
|
||||||
sd-concepts-library/toyota-sera
|
|
||||||
sd-concepts-library/transmutation-circles
|
|
||||||
sd-concepts-library/trash-polka-artstyle
|
|
||||||
sd-concepts-library/travis-bedel
|
|
||||||
sd-concepts-library/trigger-studio
|
|
||||||
sd-concepts-library/trust-support
|
|
||||||
sd-concepts-library/trypophobia
|
|
||||||
sd-concepts-library/ttte
|
|
||||||
sd-concepts-library/tubby
|
|
||||||
sd-concepts-library/tubby-cats
|
|
||||||
sd-concepts-library/tudisco
|
|
||||||
sd-concepts-library/turtlepics
|
|
||||||
sd-concepts-library/type
|
|
||||||
sd-concepts-library/ugly-sonic
|
|
||||||
sd-concepts-library/uliana-kudinova
|
|
||||||
sd-concepts-library/uma
|
|
||||||
sd-concepts-library/uma-clean-object
|
|
||||||
sd-concepts-library/uma-meme
|
|
||||||
sd-concepts-library/uma-meme-style
|
|
||||||
sd-concepts-library/uma-style-classic
|
|
||||||
sd-concepts-library/unfinished-building
|
|
||||||
sd-concepts-library/urivoldemort
|
|
||||||
sd-concepts-library/uzumaki
|
|
||||||
sd-concepts-library/valorantstyle
|
|
||||||
sd-concepts-library/vb-mox
|
|
||||||
sd-concepts-library/vcr-classique
|
|
||||||
sd-concepts-library/venice
|
|
||||||
sd-concepts-library/vespertine
|
|
||||||
sd-concepts-library/victor-narm
|
|
||||||
sd-concepts-library/vietstoneking
|
|
||||||
sd-concepts-library/vivien-reid
|
|
||||||
sd-concepts-library/vkuoo1
|
|
||||||
sd-concepts-library/vraska
|
|
||||||
sd-concepts-library/w3u
|
|
||||||
sd-concepts-library/walter-wick-photography
|
|
||||||
sd-concepts-library/warhammer-40k-drawing-style
|
|
||||||
sd-concepts-library/waterfallshadow
|
|
||||||
sd-concepts-library/wayne-reynolds-character
|
|
||||||
sd-concepts-library/wedding
|
|
||||||
sd-concepts-library/wedding-HandPainted
|
|
||||||
sd-concepts-library/werebloops
|
|
||||||
sd-concepts-library/wheatland
|
|
||||||
sd-concepts-library/wheatland-arknight
|
|
||||||
sd-concepts-library/wheelchair
|
|
||||||
sd-concepts-library/wildkat
|
|
||||||
sd-concepts-library/willy-hd
|
|
||||||
sd-concepts-library/wire-angels
|
|
||||||
sd-concepts-library/wish-artist-stile
|
|
||||||
sd-concepts-library/wlop-style
|
|
||||||
sd-concepts-library/wojak
|
|
||||||
sd-concepts-library/wojaks-now
|
|
||||||
sd-concepts-library/wojaks-now-now-now
|
|
||||||
sd-concepts-library/xatu
|
|
||||||
sd-concepts-library/xatu2
|
|
||||||
sd-concepts-library/xbh
|
|
||||||
sd-concepts-library/xi
|
|
||||||
sd-concepts-library/xidiversity
|
|
||||||
sd-concepts-library/xioboma
|
|
||||||
sd-concepts-library/xuna
|
|
||||||
sd-concepts-library/xyz
|
|
||||||
sd-concepts-library/yb-anime
|
|
||||||
sd-concepts-library/yerba-mate
|
|
||||||
sd-concepts-library/yesdelete
|
|
||||||
sd-concepts-library/yf21
|
|
||||||
sd-concepts-library/yilanov2
|
|
||||||
sd-concepts-library/yinit
|
|
||||||
sd-concepts-library/yoji-shinkawa-style
|
|
||||||
sd-concepts-library/yolandi-visser
|
|
||||||
sd-concepts-library/yoshi
|
|
||||||
sd-concepts-library/youpi2
|
|
||||||
sd-concepts-library/youtooz-candy
|
|
||||||
sd-concepts-library/yuji-himukai-style
|
|
||||||
sd-concepts-library/zaney
|
|
||||||
sd-concepts-library/zaneypixelz
|
|
||||||
sd-concepts-library/zdenek-art
|
|
||||||
sd-concepts-library/zero
|
|
||||||
sd-concepts-library/zero-bottle
|
|
||||||
sd-concepts-library/zero-suit-samus
|
|
||||||
sd-concepts-library/zillertal-can
|
|
||||||
sd-concepts-library/zizigooloo
|
|
||||||
sd-concepts-library/zk
|
|
||||||
sd-concepts-library/zoroark
|
|
@ -136,7 +136,7 @@ mixture of both using any of the accepted command switch formats:
|
|||||||
# InvokeAI initialization file
|
# InvokeAI initialization file
|
||||||
# This is the InvokeAI initialization file, which contains command-line default values.
|
# This is the InvokeAI initialization file, which contains command-line default values.
|
||||||
# Feel free to edit. If anything goes wrong, you can re-initialize this file by deleting
|
# Feel free to edit. If anything goes wrong, you can re-initialize this file by deleting
|
||||||
# or renaming it and then running configure_invokeai.py again.
|
# or renaming it and then running invokeai-configure again.
|
||||||
|
|
||||||
# The --root option below points to the folder in which InvokeAI stores its models, configs and outputs.
|
# The --root option below points to the folder in which InvokeAI stores its models, configs and outputs.
|
||||||
--root="/Users/mauwii/invokeai"
|
--root="/Users/mauwii/invokeai"
|
||||||
|
@ -51,7 +51,7 @@ You can also combine styles and concepts:
|
|||||||
If you used an installer to install InvokeAI, you may have already set a HuggingFace token.
|
If you used an installer to install InvokeAI, you may have already set a HuggingFace token.
|
||||||
If you skipped this step, you can:
|
If you skipped this step, you can:
|
||||||
|
|
||||||
- run the InvokeAI configuration script again (if you used a manual installer): `scripts/configure_invokeai.py`
|
- run the InvokeAI configuration script again (if you used a manual installer): `invokeai-configure`
|
||||||
- set one of the `HUGGINGFACE_TOKEN` or `HUGGING_FACE_HUB_TOKEN` environment variables to contain your token
|
- set one of the `HUGGINGFACE_TOKEN` or `HUGGING_FACE_HUB_TOKEN` environment variables to contain your token
|
||||||
|
|
||||||
Finally, if you already used any HuggingFace library on your computer, you might already have a token
|
Finally, if you already used any HuggingFace library on your computer, you might already have a token
|
||||||
|
@ -120,7 +120,7 @@ A number of caveats:
|
|||||||
(`--iterations`) argument.
|
(`--iterations`) argument.
|
||||||
|
|
||||||
3. Your results will be _much_ better if you use the `inpaint-1.5` model
|
3. Your results will be _much_ better if you use the `inpaint-1.5` model
|
||||||
released by runwayML and installed by default by `scripts/configure_invokeai.py`.
|
released by runwayML and installed by default by `invokeai-configure`.
|
||||||
This model was trained specifically to harmoniously fill in image gaps. The
|
This model was trained specifically to harmoniously fill in image gaps. The
|
||||||
standard model will work as well, but you may notice color discontinuities at
|
standard model will work as well, but you may notice color discontinuities at
|
||||||
the border.
|
the border.
|
||||||
|
@ -28,11 +28,11 @@ should "just work" without further intervention. Simply pass the `--upscale`
|
|||||||
the popup in the Web GUI.
|
the popup in the Web GUI.
|
||||||
|
|
||||||
**GFPGAN** requires a series of downloadable model files to work. These are
|
**GFPGAN** requires a series of downloadable model files to work. These are
|
||||||
loaded when you run `scripts/configure_invokeai.py`. If GFPAN is failing with an
|
loaded when you run `invokeai-configure`. If GFPAN is failing with an
|
||||||
error, please run the following from the InvokeAI directory:
|
error, please run the following from the InvokeAI directory:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python scripts/configure_invokeai.py
|
invokeai-configure
|
||||||
```
|
```
|
||||||
|
|
||||||
If you do not run this script in advance, the GFPGAN module will attempt to
|
If you do not run this script in advance, the GFPGAN module will attempt to
|
||||||
@ -106,7 +106,7 @@ This repo also allows you to perform face restoration using
|
|||||||
[CodeFormer](https://github.com/sczhou/CodeFormer).
|
[CodeFormer](https://github.com/sczhou/CodeFormer).
|
||||||
|
|
||||||
In order to setup CodeFormer to work, you need to download the models like with
|
In order to setup CodeFormer to work, you need to download the models like with
|
||||||
GFPGAN. You can do this either by running `configure_invokeai.py` or by manually
|
GFPGAN. You can do this either by running `invokeai-configure` or by manually
|
||||||
downloading the
|
downloading the
|
||||||
[model file](https://github.com/sczhou/CodeFormer/releases/download/v0.1.0/codeformer.pth)
|
[model file](https://github.com/sczhou/CodeFormer/releases/download/v0.1.0/codeformer.pth)
|
||||||
and saving it to `ldm/invoke/restoration/codeformer/weights` folder.
|
and saving it to `ldm/invoke/restoration/codeformer/weights` folder.
|
||||||
|
@ -29,8 +29,9 @@ version of InvokeAI with the option to upgrade to experimental versions later.
|
|||||||
2. Check that your system has an up-to-date Python installed. To do this, open
|
2. Check that your system has an up-to-date Python installed. To do this, open
|
||||||
up a command-line window ("Terminal" on Linux and Macintosh, "Command" or
|
up a command-line window ("Terminal" on Linux and Macintosh, "Command" or
|
||||||
"Powershell" on Windows) and type `python --version`. If Python is
|
"Powershell" on Windows) and type `python --version`. If Python is
|
||||||
installed, it will print out the version number. If it is version `3.9.1` or
|
installed, it will print out the version number. If it is version `3.9.1` or `3.10.x`, you meet requirements.
|
||||||
higher, you meet requirements.
|
|
||||||
|
!!! warning "At this time we do not recommend Python 3.11"
|
||||||
|
|
||||||
!!! warning "If you see an older version, or get a command not found error"
|
!!! warning "If you see an older version, or get a command not found error"
|
||||||
|
|
||||||
@ -39,7 +40,6 @@ version of InvokeAI with the option to upgrade to experimental versions later.
|
|||||||
[Version 3.10.9](https://www.python.org/downloads/release/python-3109/),
|
[Version 3.10.9](https://www.python.org/downloads/release/python-3109/),
|
||||||
which has been extensively tested with InvokeAI.
|
which has been extensively tested with InvokeAI.
|
||||||
|
|
||||||
!!! warning "At this time we do not recommend Python 3.11"
|
|
||||||
|
|
||||||
_Please select your platform in the section below for platform-specific
|
_Please select your platform in the section below for platform-specific
|
||||||
setup requirements._
|
setup requirements._
|
||||||
@ -108,12 +108,11 @@ version of InvokeAI with the option to upgrade to experimental versions later.
|
|||||||
[latest release](https://github.com/invoke-ai/InvokeAI/releases/latest), and
|
[latest release](https://github.com/invoke-ai/InvokeAI/releases/latest), and
|
||||||
look for a series of files named:
|
look for a series of files named:
|
||||||
|
|
||||||
- InvokeAI-installer-2.X.X-mac.zip
|
- InvokeAI-installer-2.X.X.zip
|
||||||
- InvokeAI-installer-2.X.X-windows.zip
|
|
||||||
- InvokeAI-installer-2.X.X-linux.zip
|
|
||||||
|
|
||||||
(Where 2.X.X is the current release number).
|
(Where 2.X.X is the current release number).
|
||||||
Download the one that is appropriate for your operating system.
|
|
||||||
|
Download the latest release.
|
||||||
|
|
||||||
4. Unpack the zip file into a convenient directory. This will create a new
|
4. Unpack the zip file into a convenient directory. This will create a new
|
||||||
directory named "InvokeAI-Installer". This example shows how this would look
|
directory named "InvokeAI-Installer". This example shows how this would look
|
||||||
@ -177,8 +176,7 @@ version of InvokeAI with the option to upgrade to experimental versions later.
|
|||||||
minutes and nothing is happening, you can interrupt the script with ^C. You
|
minutes and nothing is happening, you can interrupt the script with ^C. You
|
||||||
may restart it and it will pick up where it left off.
|
may restart it and it will pick up where it left off.
|
||||||
|
|
||||||
10. After installation completes, the installer will launch a script called
|
10. After installation completes, the installer will launch the configuration script, which will guide you through the first-time process
|
||||||
`configure_invokeai.py`, which will guide you through the first-time process
|
|
||||||
of selecting one or more Stable Diffusion model weights files, downloading
|
of selecting one or more Stable Diffusion model weights files, downloading
|
||||||
and configuring them. We provide a list of popular models that InvokeAI
|
and configuring them. We provide a list of popular models that InvokeAI
|
||||||
performs well with. However, you can add more weight files later on using
|
performs well with. However, you can add more weight files later on using
|
||||||
@ -227,7 +225,7 @@ version of InvokeAI with the option to upgrade to experimental versions later.
|
|||||||
`invokeai\invokeai.init`. It contains a variety of examples that you can
|
`invokeai\invokeai.init`. It contains a variety of examples that you can
|
||||||
follow to add and modify launch options.
|
follow to add and modify launch options.
|
||||||
|
|
||||||
!!! warning "The `invokeai` directory contains the `invoke` application, its
|
!!! warning "The `invokeai` directory contains the `invokeai` application, its
|
||||||
configuration files, the model weight files, and outputs of image generation.
|
configuration files, the model weight files, and outputs of image generation.
|
||||||
Once InvokeAI is installed, do not move or remove this directory."
|
Once InvokeAI is installed, do not move or remove this directory."
|
||||||
|
|
||||||
@ -253,18 +251,18 @@ will bring InvokeAI up to date with the latest libraries.
|
|||||||
|
|
||||||
### Corrupted configuration file
|
### Corrupted configuration file
|
||||||
|
|
||||||
Everything seems to install ok, but `invoke` complains of a corrupted
|
Everything seems to install ok, but `invokeai` complains of a corrupted
|
||||||
configuration file and goes back into the configuration process (asking you to
|
configuration file and goes back into the configuration process (asking you to
|
||||||
download models, etc), but this doesn't fix the problem.
|
download models, etc), but this doesn't fix the problem.
|
||||||
|
|
||||||
This issue is often caused by a misconfigured configuration directive in the
|
This issue is often caused by a misconfigured configuration directive in the
|
||||||
`invokeai\invokeai.init` initialization file that contains startup settings. The
|
`invokeai\invokeai.init` initialization file that contains startup settings. The
|
||||||
easiest way to fix the problem is to move the file out of the way and re-run
|
easiest way to fix the problem is to move the file out of the way and re-run
|
||||||
`configure_invokeai.py`. Enter the developer's console (option 3 of the launcher
|
`invokeai-configure`. Enter the developer's console (option 3 of the launcher
|
||||||
script) and run this command:
|
script) and run this command:
|
||||||
|
|
||||||
```cmd
|
```cmd
|
||||||
configure_invokeai.py --root=.
|
invokeai-configure --root=.
|
||||||
```
|
```
|
||||||
|
|
||||||
Note the dot (.) after `--root`. It is part of the command.
|
Note the dot (.) after `--root`. It is part of the command.
|
||||||
@ -289,15 +287,15 @@ hours, and often much sooner.
|
|||||||
This distribution is changing rapidly, and we add new features on a daily basis.
|
This distribution is changing rapidly, and we add new features on a daily basis.
|
||||||
To update to the latest released version (recommended), run the `update.sh`
|
To update to the latest released version (recommended), run the `update.sh`
|
||||||
(Linux/Mac) or `update.bat` (Windows) scripts. This will fetch the latest
|
(Linux/Mac) or `update.bat` (Windows) scripts. This will fetch the latest
|
||||||
release and re-run the `configure_invokeai` script to download any updated
|
release and re-run the `invokeai-configure` script to download any updated
|
||||||
models files that may be needed. You can also use this to add additional models
|
models files that may be needed. You can also use this to add additional models
|
||||||
that you did not select at installation time.
|
that you did not select at installation time.
|
||||||
|
|
||||||
You can now close the developer console and run `invoke` as before. If you get
|
You can now close the developer console and run `invoke` as before. If you get
|
||||||
complaints about missing models, then you may need to do the additional step of
|
complaints about missing models, then you may need to do the additional step of
|
||||||
running `configure_invokeai.py`. This happens relatively infrequently. To do
|
running `invokeai-configure`. This happens relatively infrequently. To do
|
||||||
this, simply open up the developer's console again and type
|
this, simply open up the developer's console again and type
|
||||||
`python scripts/configure_invokeai.py`.
|
`invokeai-configure`.
|
||||||
|
|
||||||
You may also use the `update` script to install any selected version of
|
You may also use the `update` script to install any selected version of
|
||||||
InvokeAI. From https://github.com/invoke-ai/InvokeAI, navigate to the zip file
|
InvokeAI. From https://github.com/invoke-ai/InvokeAI, navigate to the zip file
|
||||||
|
@ -135,10 +135,10 @@ manager, please follow these steps:
|
|||||||
default to `invokeai` in your home directory.
|
default to `invokeai` in your home directory.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
configure_invokeai --root_dir ~/Programs/invokeai
|
invokeai-configure --root_dir ~/Programs/invokeai
|
||||||
```
|
```
|
||||||
|
|
||||||
The script `configure_invokeai.py` will interactively guide you through the
|
The script `invokeai-configure` will interactively guide you through the
|
||||||
process of downloading and installing the weights files needed for InvokeAI.
|
process of downloading and installing the weights files needed for InvokeAI.
|
||||||
Note that the main Stable Diffusion weights file is protected by a license
|
Note that the main Stable Diffusion weights file is protected by a license
|
||||||
agreement that you have to agree to. The script will list the steps you need
|
agreement that you have to agree to. The script will list the steps you need
|
||||||
@ -149,10 +149,10 @@ manager, please follow these steps:
|
|||||||
If you get an error message about a module not being installed, check that
|
If you get an error message about a module not being installed, check that
|
||||||
the `invokeai` environment is active and if not, repeat step 5.
|
the `invokeai` environment is active and if not, repeat step 5.
|
||||||
|
|
||||||
Note that `configure_invokeai.py` and `invoke.py` should be installed
|
Note that `invokeai-configure` and `invoke.py` should be installed
|
||||||
under your virtual environment directory and the system should find them
|
under your virtual environment directory and the system should find them
|
||||||
on the PATH. If this isn't working on your system, you can call the
|
on the PATH. If this isn't working on your system, you can call the
|
||||||
scripts directory using `python scripts/configure_invokeai.py` and
|
scripts directory using `python scripts/invokeai-configure` and
|
||||||
`python scripts/invoke.py`.
|
`python scripts/invoke.py`.
|
||||||
|
|
||||||
!!! tip
|
!!! tip
|
||||||
@ -353,10 +353,10 @@ manager, please follow these steps:
|
|||||||
default to `invokeai` in your home directory.
|
default to `invokeai` in your home directory.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python scripts/configure_invokeai.py --root_dir ~/Programs/invokeai
|
python scripts/invokeai-configure --root_dir ~/Programs/invokeai
|
||||||
```
|
```
|
||||||
|
|
||||||
The script `configure_invokeai.py` will interactively guide you through the
|
The script `invokeai-configure` will interactively guide you through the
|
||||||
process of downloading and installing the weights files needed for InvokeAI.
|
process of downloading and installing the weights files needed for InvokeAI.
|
||||||
Note that the main Stable Diffusion weights file is protected by a license
|
Note that the main Stable Diffusion weights file is protected by a license
|
||||||
agreement that you have to agree to. The script will list the steps you need
|
agreement that you have to agree to. The script will list the steps you need
|
||||||
@ -367,7 +367,7 @@ manager, please follow these steps:
|
|||||||
If you get an error message about a module not being installed, check that
|
If you get an error message about a module not being installed, check that
|
||||||
the `invokeai` environment is active and if not, repeat step 5.
|
the `invokeai` environment is active and if not, repeat step 5.
|
||||||
|
|
||||||
Note that `configure_invokeai.py` and `invoke.py` should be
|
Note that `invokeai-configure` and `invoke.py` should be
|
||||||
installed under your conda directory and the system should find
|
installed under your conda directory and the system should find
|
||||||
them automatically on the PATH. If this isn't working on your
|
them automatically on the PATH. If this isn't working on your
|
||||||
system, you can call the scripts directory using `python
|
system, you can call the scripts directory using `python
|
||||||
@ -468,7 +468,7 @@ greatest version, launch the Anaconda window, enter `InvokeAI` and type:
|
|||||||
```bash
|
```bash
|
||||||
git pull
|
git pull
|
||||||
conda env update
|
conda env update
|
||||||
python scripts/configure_invokeai.py --skip-sd-weights #optional
|
python scripts/invokeai-configure --skip-sd-weights #optional
|
||||||
```
|
```
|
||||||
|
|
||||||
This will bring your local copy into sync with the remote one. The last step may
|
This will bring your local copy into sync with the remote one. The last step may
|
||||||
@ -518,7 +518,7 @@ brew install llvm
|
|||||||
|
|
||||||
If brew config has Clang installed, update to the latest llvm and try creating the environment again.
|
If brew config has Clang installed, update to the latest llvm and try creating the environment again.
|
||||||
|
|
||||||
#### `configure_invokeai.py` or `invoke.py` crashes at an early stage
|
#### `invokeai-configure` or `invoke.py` crashes at an early stage
|
||||||
|
|
||||||
This is usually due to an incomplete or corrupted Conda install. Make sure you
|
This is usually due to an incomplete or corrupted Conda install. Make sure you
|
||||||
have linked to the correct environment file and run `conda update` again.
|
have linked to the correct environment file and run `conda update` again.
|
||||||
|
@ -56,7 +56,7 @@ unofficial Stable Diffusion models and where they can be obtained.
|
|||||||
|
|
||||||
There are three ways to install weights files:
|
There are three ways to install weights files:
|
||||||
|
|
||||||
1. During InvokeAI installation, the `configure_invokeai.py` script can download
|
1. During InvokeAI installation, the `invokeai-configure` script can download
|
||||||
them for you.
|
them for you.
|
||||||
|
|
||||||
2. You can use the command-line interface (CLI) to import, configure and modify
|
2. You can use the command-line interface (CLI) to import, configure and modify
|
||||||
@ -65,13 +65,13 @@ There are three ways to install weights files:
|
|||||||
3. You can download the files manually and add the appropriate entries to
|
3. You can download the files manually and add the appropriate entries to
|
||||||
`models.yaml`.
|
`models.yaml`.
|
||||||
|
|
||||||
### Installation via `configure_invokeai.py`
|
### Installation via `invokeai-configure`
|
||||||
|
|
||||||
This is the most automatic way. Run `scripts/configure_invokeai.py` from the
|
This is the most automatic way. Run `invokeai-configure` from the
|
||||||
console. It will ask you to select which models to download and lead you through
|
console. It will ask you to select which models to download and lead you through
|
||||||
the steps of setting up a Hugging Face account if you haven't done so already.
|
the steps of setting up a Hugging Face account if you haven't done so already.
|
||||||
|
|
||||||
To start, run `python scripts/configure_invokeai.py` from within the InvokeAI:
|
To start, run `invokeai-configure` from within the InvokeAI:
|
||||||
directory
|
directory
|
||||||
|
|
||||||
!!! example ""
|
!!! example ""
|
||||||
@ -244,7 +244,7 @@ arabian-nights-1.0:
|
|||||||
| arabian-nights-1.0 | This is the name of the model that you will refer to from within the CLI and the WebGUI when you need to load and use the model. |
|
| arabian-nights-1.0 | This is the name of the model that you will refer to from within the CLI and the WebGUI when you need to load and use the model. |
|
||||||
| description | Any description that you want to add to the model to remind you what it is. |
|
| description | Any description that you want to add to the model to remind you what it is. |
|
||||||
| weights | Relative path to the .ckpt weights file for this model. |
|
| weights | Relative path to the .ckpt weights file for this model. |
|
||||||
| config | This is the confusingly-named configuration file for the model itself. Use `./configs/stable-diffusion/v1-inference.yaml` unless the model happens to need a custom configuration, in which case the place you downloaded it from will tell you what to use instead. For example, the runwayML custom inpainting model requires the file `configs/stable-diffusion/v1-inpainting-inference.yaml`. This is already inclued in the InvokeAI distribution and is configured automatically for you by the `configure_invokeai.py` script. |
|
| config | This is the confusingly-named configuration file for the model itself. Use `./configs/stable-diffusion/v1-inference.yaml` unless the model happens to need a custom configuration, in which case the place you downloaded it from will tell you what to use instead. For example, the runwayML custom inpainting model requires the file `configs/stable-diffusion/v1-inpainting-inference.yaml`. This is already inclued in the InvokeAI distribution and is configured automatically for you by the `invokeai-configure` script. |
|
||||||
| vae | If you want to add a VAE file to the model, then enter its path here. |
|
| vae | If you want to add a VAE file to the model, then enter its path here. |
|
||||||
| width, height | This is the width and height of the images used to train the model. Currently they are always 512 and 512. |
|
| width, height | This is the width and height of the images used to train the model. Currently they are always 512 and 512. |
|
||||||
|
|
||||||
|
@ -24,6 +24,7 @@ opencv-python
|
|||||||
picklescan
|
picklescan
|
||||||
pillow
|
pillow
|
||||||
pip>=22
|
pip>=22
|
||||||
|
prompt-toolkit
|
||||||
pudb
|
pudb
|
||||||
pyreadline3
|
pyreadline3
|
||||||
pytorch-lightning==1.7.7
|
pytorch-lightning==1.7.7
|
||||||
|
48
frontend/dist/assets/index-legacy-35973932.js
vendored
625
frontend/dist/assets/index.5c5bc3f1.js
vendored
64
installer/create_installer.sh
Normal file → Executable file
@ -1,7 +1,16 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
cd "$(dirname "$0")"
|
cd "$(dirname "$0")"
|
||||||
|
|
||||||
|
if [[ -v "VIRTUAL_ENV" ]]; then
|
||||||
|
# we can't just call 'deactivate' because this function is not exported
|
||||||
|
# to the environment of this script from the bash process that runs the script
|
||||||
|
echo "A virtual environment is activated. Please deactivate it before proceeding".
|
||||||
|
exit -1
|
||||||
|
fi
|
||||||
|
|
||||||
VERSION=$(cd ..; python -c "from ldm.invoke import __version__ as version; print(version)")
|
VERSION=$(cd ..; python -c "from ldm.invoke import __version__ as version; print(version)")
|
||||||
PATCH=""
|
PATCH=""
|
||||||
VERSION="v${VERSION}${PATCH}"
|
VERSION="v${VERSION}${PATCH}"
|
||||||
@ -23,38 +32,48 @@ if [ "$RESPONSE" == 'y' ]; then
|
|||||||
git tag -fa latest
|
git tag -fa latest
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# ----------------------
|
||||||
|
|
||||||
|
echo Building the wheel
|
||||||
|
|
||||||
|
# install the 'build' package in the user site packages, if needed
|
||||||
|
# could be improved by using a temporary venv, but it's tiny and harmless
|
||||||
|
if [[ $(python -c 'from importlib.util import find_spec; print(find_spec("build") is None)') == "True" ]]; then
|
||||||
|
pip install --user build
|
||||||
|
fi
|
||||||
|
|
||||||
|
python -m build --wheel --outdir dist/ ../.
|
||||||
|
|
||||||
|
# ----------------------
|
||||||
|
|
||||||
echo Building installer zip fles for InvokeAI $VERSION
|
echo Building installer zip fles for InvokeAI $VERSION
|
||||||
|
|
||||||
# get rid of any old ones
|
# get rid of any old ones
|
||||||
rm *.zip
|
rm -f *.zip
|
||||||
|
|
||||||
rm -rf InvokeAI-Installer
|
rm -rf InvokeAI-Installer
|
||||||
|
|
||||||
|
# copy content
|
||||||
mkdir InvokeAI-Installer
|
mkdir InvokeAI-Installer
|
||||||
|
for f in templates *.py *.txt *.reg; do
|
||||||
|
cp -r ${f} InvokeAI-Installer/
|
||||||
|
done
|
||||||
|
|
||||||
cp -pr ../environments-and-requirements templates readme.txt InvokeAI-Installer/
|
# Move the wheel
|
||||||
mkdir InvokeAI-Installer/templates/rootdir
|
mv dist/*.whl InvokeAI-Installer/
|
||||||
|
|
||||||
cp -pr ../configs InvokeAI-Installer/templates/rootdir/
|
# Install scripts
|
||||||
|
# Mac/Linux
|
||||||
|
cp install.sh.in InvokeAI-Installer/install.sh
|
||||||
|
chmod a+x InvokeAI-Installer/install.sh
|
||||||
|
|
||||||
mkdir InvokeAI-Installer/templates/rootdir/{outputs,embeddings,models}
|
# Windows
|
||||||
|
|
||||||
perl -p -e "s/^INVOKEAI_VERSION=.*/INVOKEAI_VERSION=\"$VERSION\"/" install.sh.in > InvokeAI-Installer/install.sh
|
|
||||||
chmod a+rx InvokeAI-Installer/install.sh
|
|
||||||
|
|
||||||
zip -r InvokeAI-installer-$VERSION-linux.zip InvokeAI-Installer
|
|
||||||
zip -r InvokeAI-installer-$VERSION-mac.zip InvokeAI-Installer
|
|
||||||
|
|
||||||
# now do the windows installer
|
|
||||||
rm InvokeAI-Installer/install.sh
|
|
||||||
perl -p -e "s/^set INVOKEAI_VERSION=.*/set INVOKEAI_VERSION=$VERSION/" install.bat.in > InvokeAI-Installer/install.bat
|
perl -p -e "s/^set INVOKEAI_VERSION=.*/set INVOKEAI_VERSION=$VERSION/" install.bat.in > InvokeAI-Installer/install.bat
|
||||||
cp WinLongPathsEnabled.reg InvokeAI-Installer/
|
cp WinLongPathsEnabled.reg InvokeAI-Installer/
|
||||||
|
|
||||||
# this gets rid of the "-e ." at the end of the windows requirements file
|
# Zip everything up
|
||||||
# because it is easier to do it now than in the .bat install script
|
zip -r InvokeAI-installer-$VERSION.zip InvokeAI-Installer
|
||||||
egrep -v '^-e .' InvokeAI-Installer/environments-and-requirements/requirements-win-colab-cuda.txt > InvokeAI-Installer/requirements.txt
|
|
||||||
cp InvokeAI-Installer/requirements.txt InvokeAI-Installer/environments-and-requirements/requirements-win-colab-cuda.txt
|
|
||||||
zip -r InvokeAI-installer-$VERSION-windows.zip InvokeAI-Installer
|
|
||||||
|
|
||||||
|
# Updater
|
||||||
mkdir tmp
|
mkdir tmp
|
||||||
cp templates/update.sh.in tmp/update.sh
|
cp templates/update.sh.in tmp/update.sh
|
||||||
cp templates/update.bat.in tmp/update.bat
|
cp templates/update.bat.in tmp/update.bat
|
||||||
@ -66,9 +85,6 @@ cd ..
|
|||||||
mv tmp/InvokeAI-updater-$VERSION.zip .
|
mv tmp/InvokeAI-updater-$VERSION.zip .
|
||||||
|
|
||||||
# clean up
|
# clean up
|
||||||
rm -rf InvokeAI-Installer tmp
|
rm -rf InvokeAI-Installer tmp dist
|
||||||
|
|
||||||
|
|
||||||
exit 0
|
exit 0
|
||||||
|
|
||||||
|
|
||||||
|
@ -16,7 +16,6 @@ if "%1" == "use-cache" (
|
|||||||
@rem The version in the next line is replaced by an up to date release number
|
@rem The version in the next line is replaced by an up to date release number
|
||||||
@rem when create_installer.sh is run. Change the release number there.
|
@rem when create_installer.sh is run. Change the release number there.
|
||||||
set INVOKEAI_VERSION=latest
|
set INVOKEAI_VERSION=latest
|
||||||
set INVOKE_AI_SRC=https://github.com/invoke-ai/InvokeAI/archive/refs/tags/%INVOKEAI_VERSION%.zip
|
|
||||||
set INSTRUCTIONS=https://invoke-ai.github.io/InvokeAI/installation/INSTALL_AUTOMATED/
|
set INSTRUCTIONS=https://invoke-ai.github.io/InvokeAI/installation/INSTALL_AUTOMATED/
|
||||||
set TROUBLESHOOTING=https://invoke-ai.github.io/InvokeAI/installation/INSTALL_AUTOMATED/#troubleshooting
|
set TROUBLESHOOTING=https://invoke-ai.github.io/InvokeAI/installation/INSTALL_AUTOMATED/#troubleshooting
|
||||||
set PYTHON_URL=https://www.python.org/downloads/windows/
|
set PYTHON_URL=https://www.python.org/downloads/windows/
|
||||||
@ -29,7 +28,8 @@ set err_msg=An error has occurred and the script could not continue.
|
|||||||
echo This script will install InvokeAI and its dependencies.
|
echo This script will install InvokeAI and its dependencies.
|
||||||
echo.
|
echo.
|
||||||
echo BEFORE YOU START PLEASE MAKE SURE TO DO THE FOLLOWING
|
echo BEFORE YOU START PLEASE MAKE SURE TO DO THE FOLLOWING
|
||||||
echo 1. Install python 3.9 or higher.
|
echo 1. Install python 3.9 or 3.10. Python version 3.11 and above are
|
||||||
|
echo not supported at the moment.
|
||||||
echo 2. Double-click on the file WinLongPathsEnabled.reg in order to
|
echo 2. Double-click on the file WinLongPathsEnabled.reg in order to
|
||||||
echo enable long path support on your system.
|
echo enable long path support on your system.
|
||||||
echo 3. Install the Visual C++ core libraries.
|
echo 3. Install the Visual C++ core libraries.
|
||||||
@ -45,7 +45,7 @@ echo ***** Checking and Updating Python *****
|
|||||||
|
|
||||||
call python --version >.tmp1 2>.tmp2
|
call python --version >.tmp1 2>.tmp2
|
||||||
if %errorlevel% == 1 (
|
if %errorlevel% == 1 (
|
||||||
set err_msg=Please install Python 3.9 or higher. See %INSTRUCTIONS% for details.
|
set err_msg=Please install Python 3.10. See %INSTRUCTIONS% for details.
|
||||||
goto err_exit
|
goto err_exit
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -64,111 +64,10 @@ if %errorlevel% == 1 (
|
|||||||
@rem Cleanup
|
@rem Cleanup
|
||||||
del /q .tmp1 .tmp2
|
del /q .tmp1 .tmp2
|
||||||
|
|
||||||
@rem --------------------- Get the requirements file ------------
|
@rem -------------- Install and Configure ---------------
|
||||||
echo.
|
|
||||||
echo Setting up requirements file for your system.
|
|
||||||
copy /y environments-and-requirements\requirements-win-colab-cuda.txt .\requirements.txt
|
|
||||||
|
|
||||||
@rem --------------------- Get the root directory for installation ------------
|
call python main.py
|
||||||
set "rootdir="
|
|
||||||
set "response="
|
|
||||||
set "selection="
|
|
||||||
:pick_rootdir
|
|
||||||
if defined rootdir goto :done
|
|
||||||
set /p selection=Select the path to install InvokeAI's directory into [%UserProfile%]:
|
|
||||||
if not defined selection set selection=%UserProfile%
|
|
||||||
set selection=%selection:"=%
|
|
||||||
call :Trim selection !selection!
|
|
||||||
set dest="%selection%\invokeai"
|
|
||||||
if exist %dest% (
|
|
||||||
set response=y
|
|
||||||
set /p response=The directory %dest% exists. Do you wish to resume install from a previous attempt? [Y/n]:
|
|
||||||
if !response! == "" set response=y
|
|
||||||
if /I !response! == y (set rootdir=%dest%) else (goto :pick_rootdir)
|
|
||||||
) else (
|
|
||||||
set rootdir=!dest!
|
|
||||||
)
|
|
||||||
set response=y
|
|
||||||
set /p response="You have chosen to install InvokeAI into %rootdir%. OK? [Y/n]: "
|
|
||||||
if !response! == "" set response=y
|
|
||||||
if /I !response! neq y set "rootdir="
|
|
||||||
goto :pick_rootdir
|
|
||||||
:done
|
|
||||||
|
|
||||||
set rootdir=%rootdir:"=%
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@rem ---------------------- Initialize the runtime directory ---------------------
|
|
||||||
echo.
|
|
||||||
echo *** Creating Runtime Directory %rootdir% ***
|
|
||||||
if not exist "%rootdir%" mkdir "%rootdir%"
|
|
||||||
@rem for unknown reasons the mkdir works but returns an error code
|
|
||||||
if not exist "%rootdir%" (
|
|
||||||
set err_msg=Could not create the directory %rootdir%. Please check the directory's permissions and try again.
|
|
||||||
goto :err_exit
|
|
||||||
)
|
|
||||||
echo Successful.
|
|
||||||
|
|
||||||
@rem --------------------------- Create and populate .venv ---------------------------
|
|
||||||
echo.
|
|
||||||
echo ** Creating Virtual Environment for InvokeAI **
|
|
||||||
call python -mvenv "%rootdir%\.venv"
|
|
||||||
if %errorlevel% neq 0 (
|
|
||||||
set err_msg=Could not create virtual environment %rootdir%\.venv. Please check the directory's permissions and try again.
|
|
||||||
goto :err_exit
|
|
||||||
)
|
|
||||||
echo Successful.
|
|
||||||
|
|
||||||
echo.
|
|
||||||
echo *** Installing InvokeAI Requirements ***
|
|
||||||
echo Activating environment
|
|
||||||
call "%rootdir%\.venv\Scripts\activate.bat"
|
|
||||||
|
|
||||||
set PYTHON=%rootdir%\.venv\Scripts\python
|
|
||||||
echo updating pip with "%PYTHON%"
|
|
||||||
call "%PYTHON%" -mensurepip --upgrade
|
|
||||||
call "%PYTHON%" -mpip install --prefer-binary -r requirements.txt
|
|
||||||
if %errorlevel% neq 0 (
|
|
||||||
set err_msg=Requirements installation failed. See above for errors and check %TROUBLESHOOTING% for potential solutions.
|
|
||||||
goto :err_exit
|
|
||||||
)
|
|
||||||
echo Installation successful.
|
|
||||||
|
|
||||||
echo.
|
|
||||||
echo *** Installing InvokeAI Modules and Executables ***
|
|
||||||
call "%PYTHON%" -mpip install %INVOKE_AI_SRC%
|
|
||||||
if %errorlevel% neq 0 (
|
|
||||||
set err_msg=Installation of InvokeAI failed. See above for errors and check %TROUBLESHOOTING% for potential solutions.
|
|
||||||
goto :err_exit
|
|
||||||
)
|
|
||||||
echo Installation successful.
|
|
||||||
|
|
||||||
@rem --------------------------- Set up the root directory ---------------------------
|
|
||||||
xcopy /E /Y .\templates\rootdir "%rootdir%"
|
|
||||||
PUSHD "%rootdir%"
|
|
||||||
call "%PYTHON%" .venv\Scripts\configure_invokeai.py "--root=%rootdir%"
|
|
||||||
if %errorlevel% neq 0 (
|
|
||||||
set err_msg=Configuration failed. See above for error messages and check %TROUBLESHOOTING% for potential solutions.
|
|
||||||
goto :err_exit
|
|
||||||
)
|
|
||||||
POPD
|
|
||||||
|
|
||||||
copy .\templates\invoke.bat.in "%rootdir%\invoke.bat"
|
|
||||||
copy .\templates\update.bat.in "%rootdir%\update.bat"
|
|
||||||
|
|
||||||
@rem so that update.bat works
|
|
||||||
mkdir "%rootdir%\environments-and-requirements"
|
|
||||||
xcopy /I /Y .\environments-and-requirements "%rootdir%\environments-and-requirements"
|
|
||||||
copy .\requirements.txt "%rootdir%\requirements.txt"
|
|
||||||
|
|
||||||
|
|
||||||
echo.
|
|
||||||
echo ***** Finished configuration *****
|
|
||||||
echo All done. Execute the file %rootdir%\invoke.bat to start InvokeAI.
|
|
||||||
pause
|
|
||||||
deactivate
|
|
||||||
exit
|
|
||||||
|
|
||||||
@rem ------------------------ Subroutines ---------------
|
@rem ------------------------ Subroutines ---------------
|
||||||
@rem routine to do comparison of semantic version numbers
|
@rem routine to do comparison of semantic version numbers
|
||||||
@ -227,4 +126,3 @@ SetLocal EnableDelayedExpansion
|
|||||||
set Params=%*
|
set Params=%*
|
||||||
for /f "tokens=1*" %%a in ("!Params!") do EndLocal & set %1=%%b
|
for /f "tokens=1*" %%a in ("!Params!") do EndLocal & set %1=%%b
|
||||||
exit /b
|
exit /b
|
||||||
|
|
||||||
|
@ -1,234 +1,7 @@
|
|||||||
#!/usr/bin/env bash
|
#!/bin/bash
|
||||||
|
|
||||||
# ensure we're in the correct folder in case user's CWD is somewhere else
|
|
||||||
scriptdir=$(dirname "$0")
|
|
||||||
cd "$scriptdir"
|
|
||||||
|
|
||||||
# This version number will be replaced by the one supplied to create_installers.sh.
|
|
||||||
# Do not change it here - change it in create_installers.sh.
|
|
||||||
INVOKEAI_VERSION="latest"
|
|
||||||
|
|
||||||
# make sure we are not already in a venv
|
# make sure we are not already in a venv
|
||||||
# (don't need to check status)
|
# (don't need to check status)
|
||||||
deactivate >/dev/null 2>&1
|
deactivate >/dev/null 2>&1
|
||||||
|
|
||||||
INVOKE_AI_SRC=https://github.com/invoke-ai/InvokeAI/archive/refs/tags/${INVOKEAI_VERSION}.zip
|
exec python3 $(dirname $0)/main.py ${@}
|
||||||
INSTRUCTIONS=https://invoke-ai.github.io/InvokeAI/installation/INSTALL_AUTOMATED/
|
|
||||||
TROUBLESHOOTING=https://invoke-ai.github.io/InvokeAI/installation/INSTALL_AUTOMATED/#troubleshooting
|
|
||||||
MINIMUM_PYTHON_VERSION=3.9.0
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
IFS=$'\n\t'
|
|
||||||
|
|
||||||
function _err_exit {
|
|
||||||
if test "$1" -ne 0
|
|
||||||
then
|
|
||||||
echo -e "Error code $1; Error caught was '$2'"
|
|
||||||
if [ "$OS_NAME" == "osx" ]; then
|
|
||||||
echo "Something went wrong while installing InvokeAI and/or its requirements."
|
|
||||||
echo "You may need to use the Xcode command line tools to proceed. See step number 3 of"
|
|
||||||
echo "https://invoke-ai.github.io/InvokeAI/INSTALL_SOURCE#walk_through for"
|
|
||||||
echo "installation instructions and then run this script again."
|
|
||||||
else
|
|
||||||
echo "Something went wrong while installing InvokeAI and/or its requirements."
|
|
||||||
echo "See https://invoke-ai.github.io/InvokeAI/INSTALL_SOURCE#troubleshooting for troubleshooting"
|
|
||||||
echo "tips, or visit https://invoke-ai.github.io/InvokeAI/#installation for alternative"
|
|
||||||
echo "installation methods"
|
|
||||||
fi
|
|
||||||
read -p "Press any key to exit..."
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
function readinput() {
|
|
||||||
local CLEAN_ARGS=""
|
|
||||||
while [[ $# -gt 0 ]]; do
|
|
||||||
local i="$1"
|
|
||||||
case "$i" in
|
|
||||||
"-i")
|
|
||||||
if read -i "default" 2>/dev/null <<< "test"; then
|
|
||||||
CLEAN_ARGS="$CLEAN_ARGS -i \"$2\""
|
|
||||||
fi
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
"-p")
|
|
||||||
CLEAN_ARGS="$CLEAN_ARGS -p \"$2\""
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
CLEAN_ARGS="$CLEAN_ARGS $1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
eval read $CLEAN_ARGS
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function version { echo "$@" | awk -F. '{ printf("%d%03d%03d%03d\n", $1,$2,$3,$4); }'; }
|
|
||||||
|
|
||||||
echo "InvokeAI simple installer..."
|
|
||||||
echo ""
|
|
||||||
echo "Some of the installation steps take a long time to run. Please be patient."
|
|
||||||
echo "If the script appears to hang for more than 10 minutes, please interrupt with control-C and retry."
|
|
||||||
read -n 1 -s -r -p "<Press any key to start the install>"
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
OS_NAME=$(uname -s)
|
|
||||||
case "${OS_NAME}" in
|
|
||||||
Linux*) OS_NAME="linux";;
|
|
||||||
Darwin*) OS_NAME="osx";;
|
|
||||||
*) echo "Unknown OS: $OS_NAME! This script runs only on Linux or Mac" && exit
|
|
||||||
esac
|
|
||||||
|
|
||||||
OS_ARCH=$(uname -m)
|
|
||||||
case "${OS_ARCH}" in
|
|
||||||
x86_64*) OS_ARCH="64";;
|
|
||||||
arm64*) OS_ARCH="arm64";;
|
|
||||||
*) echo "Unknown system architecture: $OS_ARCH! This script runs only on x86_64 or arm64" && exit
|
|
||||||
esac
|
|
||||||
|
|
||||||
echo "Installing for $OS_NAME-$OS_ARCH"
|
|
||||||
# confirm that python is installed and is up to date
|
|
||||||
|
|
||||||
PYTHON=""
|
|
||||||
for candidate in python3.10 python3.9 python3 python python3.11 ; do
|
|
||||||
if ppath=`which $candidate`; then
|
|
||||||
python_version=$($ppath -V | awk '{ print $2 }')
|
|
||||||
if [ $(version $python_version) -ge $(version "$MINIMUM_PYTHON_VERSION") ]; then
|
|
||||||
PYTHON=$ppath
|
|
||||||
echo Python $python_version found at $PYTHON
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ -z "$PYTHON" ]; then
|
|
||||||
echo "A suitable Python interpreter could not be found"
|
|
||||||
echo "Please install Python 3.9 or higher before running this script. See instructions at $INSTRUCTIONS for help."
|
|
||||||
read -p "Press any key to exit"
|
|
||||||
exit -1
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
ROOTDIR=""
|
|
||||||
while [ "$ROOTDIR" == "" ]
|
|
||||||
do
|
|
||||||
echo
|
|
||||||
readinput -e -p "Select your preferred location for the 'invokeai' directory [$HOME]: " -i $HOME input
|
|
||||||
ROOTDIR=${input:=$HOME}/invokeai
|
|
||||||
|
|
||||||
# This is surprisingly hard to do in plain Bash; easier in ZSH. Just running python in subshell is easiest.
|
|
||||||
ROOTDIR=$($PYTHON -c "from pathlib import Path; print(Path('${ROOTDIR}').expanduser().resolve())")
|
|
||||||
|
|
||||||
read -e -p "InvokeAI will be installed into $ROOTDIR. OK? [y]: " input
|
|
||||||
RESPONSE=${input:='y'}
|
|
||||||
if [ "$RESPONSE" == 'y' ]; then
|
|
||||||
if [ -e "$ROOTDIR" ]; then
|
|
||||||
echo
|
|
||||||
read -e -p "Directory "$ROOTDIR" already exists. Do you want to resume an interrupted install? [y]: " input
|
|
||||||
RESPONSE=${input:='y'}
|
|
||||||
if [ "$RESPONSE" != 'y' ]; then
|
|
||||||
ROOTDIR=""
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
mkdir -p "$ROOTDIR"
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
echo "Could not create "$ROOTDIR". Try again with a different install location."
|
|
||||||
ROOTDIR=""
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
ROOTDIR=""
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------------------
|
|
||||||
echo
|
|
||||||
echo "** Creating Virtual Environment for InvokeAI **"
|
|
||||||
|
|
||||||
$PYTHON -mvenv "$ROOTDIR"/.venv
|
|
||||||
_err_exit $? "Python failed to create virtual environment "$ROOTDIR"/.venv. Please see $TROUBLESHOOTING for help."
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------------------
|
|
||||||
echo
|
|
||||||
echo "** Activating Virtual Environment for InvokeAI **"
|
|
||||||
|
|
||||||
source "$ROOTDIR"/.venv/bin/activate
|
|
||||||
_err_exit $? "Failed to activate virtual evironment "$ROOTDIR"/.venv. Please see $TROUBLESHOOTING for help."
|
|
||||||
|
|
||||||
PYTHON="$ROOTDIR"/.venv/bin/python
|
|
||||||
$PYTHON -mensurepip --upgrade
|
|
||||||
$PYTHON -mpip install --upgrade pip
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------------------
|
|
||||||
echo
|
|
||||||
echo "*** Installing InvokeAI Dependencies ***"
|
|
||||||
|
|
||||||
if [ "$OS_NAME" == "osx" ]; then
|
|
||||||
echo "macOS detected. Installing MPS and CPU support."
|
|
||||||
egrep -v '^-e .' environments-and-requirements/requirements-mac-mps-cpu.txt >requirements.txt
|
|
||||||
else
|
|
||||||
if (lsmod | grep amdgpu) &>/dev/null ; then
|
|
||||||
readinput -e -p "Linux system with AMD GPU driver detected. Install ROCm AMD accelerated support? (Otherwise, CUDA support will be installed) [n]: " input
|
|
||||||
RESPONSE=${input:='n'}
|
|
||||||
if [ "$RESPONSE" != "n" ]; then
|
|
||||||
echo "Installing ROCm (AMD) support"
|
|
||||||
egrep -v '^-e .' environments-and-requirements/requirements-lin-amd.txt >requirements.txt
|
|
||||||
else
|
|
||||||
echo "Installing CUDA support"
|
|
||||||
egrep -v '^-e .' environments-and-requirements/requirements-lin-cuda.txt >requirements.txt
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "Linux system detected. Installing CUDA and CPU support."
|
|
||||||
egrep -v '^-e .' environments-and-requirements/requirements-lin-cuda.txt >requirements.txt
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
$PYTHON -mpip install --prefer-binary -r requirements.txt
|
|
||||||
_err_exit $? "Failed to install InvokeAI's dependencies."
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------------------
|
|
||||||
echo
|
|
||||||
echo "*** Installing InvokeAI Modules and Executables ***"
|
|
||||||
$PYTHON -mpip install $INVOKE_AI_SRC
|
|
||||||
_err_exit $? "Installation of InvokeAI failed."
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------------------
|
|
||||||
echo " *** Setting Up Root Directory "$ROOTDIR" *** "
|
|
||||||
cp -pr templates/rootdir/* "$ROOTDIR"/
|
|
||||||
cp templates/invoke.sh.in "$ROOTDIR"/invoke.sh
|
|
||||||
chmod a+rx "$ROOTDIR"/invoke.sh
|
|
||||||
cp templates/update.sh.in "$ROOTDIR"/update.sh
|
|
||||||
chmod a+rx "$ROOTDIR"/update.sh
|
|
||||||
|
|
||||||
# This allows the updater to work!
|
|
||||||
cp -pr environments-and-requirements requirements.txt "$ROOTDIR/"
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------------------
|
|
||||||
echo
|
|
||||||
echo "*** Confguring InvokeAI ***"
|
|
||||||
pushd "$ROOTDIR" >/dev/null
|
|
||||||
$PYTHON ./.venv/bin/configure_invokeai.py --root="$ROOTDIR"
|
|
||||||
_err_exit $? "Initial configuration failed. Please see above error messages and $TROUBLESHOOTING for help."
|
|
||||||
|
|
||||||
#--------------------------------------------------------------------------------
|
|
||||||
popd
|
|
||||||
cp templates/invoke.sh.in "$ROOTDIR"/invoke.sh
|
|
||||||
chmod a+rx "$ROOTDIR"/invoke.sh
|
|
||||||
|
|
||||||
cp templates/update.sh.in "$ROOTDIR"/update.sh
|
|
||||||
chmod a+rx "$ROOTDIR"/update.sh
|
|
||||||
|
|
||||||
echo "You may now run InvokeAI by entering the directory $ROOTDIR and running invoke.sh:"
|
|
||||||
echo
|
|
||||||
echo " ${ROOTDIR}/invoke.sh"
|
|
||||||
echo
|
|
||||||
|
|
||||||
read -e -p "Run InvokeAI now? [y]:" input
|
|
||||||
RESPONSE=${input:='y'}
|
|
||||||
if [ "$RESPONSE" == 'y' ]; then
|
|
||||||
exec ${ROOTDIR}/invoke.sh
|
|
||||||
fi
|
|
||||||
|
443
installer/installer.py
Normal file
@ -0,0 +1,443 @@
|
|||||||
|
# Copyright (c) 2023 Eugene Brodsky (https://github.com/ebr)
|
||||||
|
"""
|
||||||
|
InvokeAI installer script
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import platform
|
||||||
|
import shutil
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
import venv
|
||||||
|
from pathlib import Path
|
||||||
|
from tempfile import TemporaryDirectory
|
||||||
|
from typing import Union
|
||||||
|
|
||||||
|
SUPPORTED_PYTHON = ">=3.9.0,<3.11"
|
||||||
|
INSTALLER_REQS = ["rich", "semver", "requests", "plumbum", "prompt-toolkit"]
|
||||||
|
BOOTSTRAP_VENV_PREFIX = "invokeai-installer-tmp"
|
||||||
|
|
||||||
|
OS = platform.uname().system
|
||||||
|
ARCH = platform.uname().machine
|
||||||
|
VERSION = "latest"
|
||||||
|
|
||||||
|
### Feature flags
|
||||||
|
# Install the virtualenv into the runtime dir
|
||||||
|
FF_VENV_IN_RUNTIME = True
|
||||||
|
|
||||||
|
# Install the wheel packaged with the installer
|
||||||
|
FF_USE_LOCAL_WHEEL = True
|
||||||
|
|
||||||
|
|
||||||
|
class Installer:
|
||||||
|
"""
|
||||||
|
Deploys an InvokeAI installation into a given path
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self) -> None:
|
||||||
|
self.reqs = INSTALLER_REQS
|
||||||
|
self.preflight()
|
||||||
|
if os.getenv("VIRTUAL_ENV") is not None:
|
||||||
|
raise NotImplementedError("A virtual environment is already activated. Please 'deactivate' before installation.")
|
||||||
|
self.bootstrap()
|
||||||
|
|
||||||
|
def preflight(self) -> None:
|
||||||
|
"""
|
||||||
|
Preflight checks
|
||||||
|
"""
|
||||||
|
|
||||||
|
# TODO
|
||||||
|
# verify python version
|
||||||
|
# on macOS verify XCode tools are present
|
||||||
|
# verify libmesa, libglx on linux
|
||||||
|
# check that the system arch is not i386 (?)
|
||||||
|
# check that the system has a GPU, and the type of GPU
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
def mktemp_venv(self) -> TemporaryDirectory:
|
||||||
|
"""
|
||||||
|
Creates a temporary virtual environment for the installer itself
|
||||||
|
|
||||||
|
:return: path to the created virtual environment directory
|
||||||
|
:rtype: TemporaryDirectory
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Cleaning up temporary directories on Windows results in a race condition
|
||||||
|
# and a stack trace.
|
||||||
|
# `ignore_cleanup_errors` was only added in Python 3.10
|
||||||
|
# users of Python 3.9 will see a gnarly stack trace on installer exit
|
||||||
|
if OS == "Windows" and int(platform.python_version_tuple()[1]) >= 10:
|
||||||
|
venv_dir = TemporaryDirectory(prefix=BOOTSTRAP_VENV_PREFIX, ignore_cleanup_errors=True)
|
||||||
|
else:
|
||||||
|
venv_dir = TemporaryDirectory(prefix=BOOTSTRAP_VENV_PREFIX)
|
||||||
|
|
||||||
|
venv.create(venv_dir.name, with_pip=True)
|
||||||
|
self.venv_dir = venv_dir
|
||||||
|
set_sys_path(Path(venv_dir.name))
|
||||||
|
|
||||||
|
return venv_dir
|
||||||
|
|
||||||
|
def bootstrap(self, verbose: bool = False) -> TemporaryDirectory:
|
||||||
|
"""
|
||||||
|
Bootstrap the installer venv with packages required at install time
|
||||||
|
|
||||||
|
:return: path to the virtual environment directory that was bootstrapped
|
||||||
|
:rtype: TemporaryDirectory
|
||||||
|
"""
|
||||||
|
|
||||||
|
print("Initializing the installer. This may take a minute - please wait...")
|
||||||
|
|
||||||
|
venv_dir = self.mktemp_venv()
|
||||||
|
pip = get_pip_from_venv(Path(venv_dir.name))
|
||||||
|
|
||||||
|
cmd = [pip, "install", "--require-virtualenv", "--use-pep517"]
|
||||||
|
cmd.extend(self.reqs)
|
||||||
|
|
||||||
|
try:
|
||||||
|
res = subprocess.check_output(cmd).decode()
|
||||||
|
if verbose:
|
||||||
|
print(res)
|
||||||
|
return venv_dir
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
print(e)
|
||||||
|
|
||||||
|
def app_venv(self, path: str = None):
|
||||||
|
"""
|
||||||
|
Create a virtualenv for the InvokeAI installation
|
||||||
|
"""
|
||||||
|
|
||||||
|
# explicit venv location
|
||||||
|
# currently unused in normal operation
|
||||||
|
# useful for testing or special cases
|
||||||
|
if path is not None:
|
||||||
|
venv_dir = Path(path)
|
||||||
|
|
||||||
|
# experimental / testing
|
||||||
|
elif not FF_VENV_IN_RUNTIME:
|
||||||
|
if OS == "Windows":
|
||||||
|
venv_dir_parent = os.getenv("APPDATA", "~/AppData/Roaming")
|
||||||
|
elif OS == "Darwin":
|
||||||
|
# there is no environment variable on macOS to find this
|
||||||
|
# TODO: confirm this is working as expected
|
||||||
|
venv_dir_parent = "~/Library/Application Support"
|
||||||
|
elif OS == "Linux":
|
||||||
|
venv_dir_parent = os.getenv("XDG_DATA_DIR", "~/.local/share")
|
||||||
|
venv_dir = Path(venv_dir_parent).expanduser().resolve() / f"InvokeAI/{VERSION}/venv"
|
||||||
|
|
||||||
|
# stable / current
|
||||||
|
else:
|
||||||
|
venv_dir = self.dest / ".venv"
|
||||||
|
|
||||||
|
venv.create(venv_dir, with_pip=True)
|
||||||
|
|
||||||
|
# upgrade pip in Python 3.9 environments
|
||||||
|
if int(platform.python_version_tuple()[1]) == 9:
|
||||||
|
|
||||||
|
from plumbum import FG, local
|
||||||
|
|
||||||
|
pip = local[get_pip_from_venv(venv_dir)]
|
||||||
|
pip[ "install", "--upgrade", "pip"] & FG
|
||||||
|
|
||||||
|
return venv_dir
|
||||||
|
|
||||||
|
def install(self, root: str = "~/invokeai", version: str = "latest", yes_to_all=False, find_links: Path = None) -> None:
|
||||||
|
"""
|
||||||
|
Install the InvokeAI application into the given runtime path
|
||||||
|
|
||||||
|
:param root: Destination path for the installation
|
||||||
|
:type root: str
|
||||||
|
:param version: InvokeAI version to install
|
||||||
|
:type version: str
|
||||||
|
:param yes: Accept defaults to all questions
|
||||||
|
:type yes: bool
|
||||||
|
:param find_links: A local directory to search for requirement wheels before going to remote indexes
|
||||||
|
:type find_links: Path
|
||||||
|
"""
|
||||||
|
|
||||||
|
import messages
|
||||||
|
|
||||||
|
messages.welcome()
|
||||||
|
|
||||||
|
self.dest = Path(root).expanduser().resolve() if yes_to_all else messages.dest_path(root)
|
||||||
|
|
||||||
|
# create the venv for the app
|
||||||
|
self.venv = self.app_venv()
|
||||||
|
|
||||||
|
self.instance = InvokeAiInstance(runtime=self.dest, venv=self.venv, version=version)
|
||||||
|
|
||||||
|
# install dependencies and the InvokeAI application
|
||||||
|
(extra_index_url,optional_modules) = get_torch_source() if not yes_to_all else (None,None)
|
||||||
|
self.instance.install(
|
||||||
|
extra_index_url,
|
||||||
|
optional_modules,
|
||||||
|
find_links,
|
||||||
|
)
|
||||||
|
|
||||||
|
# install the launch/update scripts into the runtime directory
|
||||||
|
self.instance.install_user_scripts()
|
||||||
|
|
||||||
|
# run through the configuration flow
|
||||||
|
self.instance.configure()
|
||||||
|
|
||||||
|
class InvokeAiInstance:
|
||||||
|
"""
|
||||||
|
Manages an installed instance of InvokeAI, comprising a virtual environment and a runtime directory.
|
||||||
|
The virtual environment *may* reside within the runtime directory.
|
||||||
|
A single runtime directory *may* be shared by multiple virtual environments, though this isn't currently tested or supported.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, runtime: Path, venv: Path, version: str) -> None:
|
||||||
|
|
||||||
|
self.runtime = runtime
|
||||||
|
self.venv = venv
|
||||||
|
self.pip = get_pip_from_venv(venv)
|
||||||
|
self.version = version
|
||||||
|
|
||||||
|
set_sys_path(venv)
|
||||||
|
os.environ["INVOKEAI_ROOT"] = str(self.runtime.expanduser().resolve())
|
||||||
|
os.environ["VIRTUAL_ENV"] = str(self.venv.expanduser().resolve())
|
||||||
|
|
||||||
|
def get(self) -> tuple[Path, Path]:
|
||||||
|
"""
|
||||||
|
Get the location of the virtualenv directory for this installation
|
||||||
|
|
||||||
|
:return: Paths of the runtime and the venv directory
|
||||||
|
:rtype: tuple[Path, Path]
|
||||||
|
"""
|
||||||
|
|
||||||
|
return (self.runtime, self.venv)
|
||||||
|
|
||||||
|
def install(self, extra_index_url=None, optional_modules=None, find_links=None):
|
||||||
|
"""
|
||||||
|
Install this instance, including dependencies and the app itself
|
||||||
|
|
||||||
|
:param extra_index_url: the "--extra-index-url ..." line for pip to look in extra indexes.
|
||||||
|
:type extra_index_url: str
|
||||||
|
"""
|
||||||
|
|
||||||
|
import messages
|
||||||
|
|
||||||
|
# install torch first to ensure the correct version gets installed.
|
||||||
|
# works with either source or wheel install with negligible impact on installation times.
|
||||||
|
messages.simple_banner("Installing PyTorch :fire:")
|
||||||
|
self.install_torch(extra_index_url, find_links)
|
||||||
|
|
||||||
|
messages.simple_banner("Installing the InvokeAI Application :art:")
|
||||||
|
self.install_app(extra_index_url, optional_modules, find_links)
|
||||||
|
|
||||||
|
def install_torch(self, extra_index_url=None, find_links=None):
|
||||||
|
"""
|
||||||
|
Install PyTorch
|
||||||
|
"""
|
||||||
|
|
||||||
|
from plumbum import FG, local
|
||||||
|
|
||||||
|
pip = local[self.pip]
|
||||||
|
|
||||||
|
(
|
||||||
|
pip[
|
||||||
|
"install",
|
||||||
|
"--require-virtualenv",
|
||||||
|
"torch",
|
||||||
|
"torchvision",
|
||||||
|
"--find-links" if find_links is not None else None,
|
||||||
|
find_links,
|
||||||
|
"--extra-index-url" if extra_index_url is not None else None,
|
||||||
|
extra_index_url,
|
||||||
|
]
|
||||||
|
& FG
|
||||||
|
)
|
||||||
|
|
||||||
|
def install_app(self, extra_index_url=None, optional_modules=None, find_links=None):
|
||||||
|
"""
|
||||||
|
Install the application with pip.
|
||||||
|
Supports installation from PyPi or from a local source directory.
|
||||||
|
|
||||||
|
:param extra_index_url: the "--extra-index-url ..." line for pip to look in extra indexes.
|
||||||
|
:type extra_index_url: str
|
||||||
|
|
||||||
|
:param optional_modules: optional modules to install using "[module1,module2]" format.
|
||||||
|
:type optional_modules: str
|
||||||
|
|
||||||
|
:param find_links: path to a directory containing wheels to be searched prior to going to the internet
|
||||||
|
:type find_links: Path
|
||||||
|
"""
|
||||||
|
|
||||||
|
## this only applies to pypi installs; TODO actually use this
|
||||||
|
if self.version == "pre":
|
||||||
|
version = None
|
||||||
|
pre = "--pre"
|
||||||
|
else:
|
||||||
|
version = self.version
|
||||||
|
pre = None
|
||||||
|
|
||||||
|
## TODO: only local wheel will be installed as of now; support for --version arg is TODO
|
||||||
|
if FF_USE_LOCAL_WHEEL:
|
||||||
|
# if no wheel, try to do a source install before giving up
|
||||||
|
try:
|
||||||
|
src = str(next(Path.cwd().glob("InvokeAI-*.whl")))
|
||||||
|
except StopIteration:
|
||||||
|
try:
|
||||||
|
src = Path(__file__).parents[1].expanduser().resolve()
|
||||||
|
# if the above directory contains one of these files, we'll do a source install
|
||||||
|
next(src.glob("pyproject.toml"))
|
||||||
|
next(src.glob("ldm"))
|
||||||
|
except StopIteration:
|
||||||
|
print("Unable to find a wheel or perform a source install. Giving up.")
|
||||||
|
|
||||||
|
elif version == "source":
|
||||||
|
# this makes an assumption about the location of the installer package in the source tree
|
||||||
|
src = Path(__file__).parents[1].expanduser().resolve()
|
||||||
|
else:
|
||||||
|
# will install from PyPi
|
||||||
|
src = f"invokeai=={version}" if version is not None else "invokeai"
|
||||||
|
|
||||||
|
from plumbum import FG, local
|
||||||
|
|
||||||
|
pip = local[self.pip]
|
||||||
|
|
||||||
|
(
|
||||||
|
pip[
|
||||||
|
"install",
|
||||||
|
"--require-virtualenv",
|
||||||
|
"--use-pep517",
|
||||||
|
str(src)+(optional_modules if optional_modules else ''),
|
||||||
|
"--find-links" if find_links is not None else None,
|
||||||
|
find_links,
|
||||||
|
"--extra-index-url" if extra_index_url is not None else None,
|
||||||
|
extra_index_url,
|
||||||
|
pre,
|
||||||
|
]
|
||||||
|
& FG
|
||||||
|
)
|
||||||
|
|
||||||
|
def configure(self):
|
||||||
|
"""
|
||||||
|
Configure the InvokeAI runtime directory
|
||||||
|
"""
|
||||||
|
|
||||||
|
new_argv = [sys.argv[0]]
|
||||||
|
for i in range(1,len(sys.argv)):
|
||||||
|
el = sys.argv[i]
|
||||||
|
if el in ['-r','--root']:
|
||||||
|
new_argv.append(el)
|
||||||
|
new_argv.append(sys.argv[i+1])
|
||||||
|
elif el in ['-y','--yes','--yes-to-all']:
|
||||||
|
new_argv.append(el)
|
||||||
|
sys.argv = new_argv
|
||||||
|
|
||||||
|
from messages import introduction
|
||||||
|
|
||||||
|
introduction()
|
||||||
|
|
||||||
|
from ldm.invoke.config import configure_invokeai
|
||||||
|
|
||||||
|
# NOTE: currently the config script does its own arg parsing! this means the command-line switches
|
||||||
|
# from the installer will also automatically propagate down to the config script.
|
||||||
|
# this may change in the future with config refactoring!
|
||||||
|
|
||||||
|
# set sys.argv to a consistent state
|
||||||
|
|
||||||
|
configure_invokeai.main()
|
||||||
|
|
||||||
|
def install_user_scripts(self):
|
||||||
|
"""
|
||||||
|
Copy the launch and update scripts to the runtime dir
|
||||||
|
"""
|
||||||
|
|
||||||
|
ext = "bat" if OS == "Windows" else "sh"
|
||||||
|
|
||||||
|
for script in ["invoke", "update"]:
|
||||||
|
src = Path(__file__).parent / "templates" / f"{script}.{ext}.in"
|
||||||
|
dest = self.runtime / f"{script}.{ext}"
|
||||||
|
shutil.copy(src, dest)
|
||||||
|
os.chmod(dest, 0o0755)
|
||||||
|
|
||||||
|
def update(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def remove(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
### Utility functions ###
|
||||||
|
|
||||||
|
|
||||||
|
def get_pip_from_venv(venv_path: Path) -> str:
|
||||||
|
"""
|
||||||
|
Given a path to a virtual environment, get the absolute path to the `pip` executable
|
||||||
|
in a cross-platform fashion. Does not validate that the pip executable
|
||||||
|
actually exists in the virtualenv.
|
||||||
|
|
||||||
|
:param venv_path: Path to the virtual environment
|
||||||
|
:type venv_path: Path
|
||||||
|
:return: Absolute path to the pip executable
|
||||||
|
:rtype: str
|
||||||
|
"""
|
||||||
|
|
||||||
|
pip = "Scripts\pip.exe" if OS == "Windows" else "bin/pip"
|
||||||
|
return str(venv_path.expanduser().resolve() / pip)
|
||||||
|
|
||||||
|
|
||||||
|
def set_sys_path(venv_path: Path) -> None:
|
||||||
|
"""
|
||||||
|
Given a path to a virtual environment, set the sys.path, in a cross-platform fashion,
|
||||||
|
such that packages from the given venv may be imported in the current process.
|
||||||
|
Ensure that the packages from system environment are not visible (emulate
|
||||||
|
the virtual env 'activate' script) - this doesn't work on Windows yet.
|
||||||
|
|
||||||
|
:param venv_path: Path to the virtual environment
|
||||||
|
:type venv_path: Path
|
||||||
|
"""
|
||||||
|
|
||||||
|
# filter out any paths in sys.path that may be system- or user-wide
|
||||||
|
# but leave the temporary bootstrap virtualenv as it contains packages we
|
||||||
|
# temporarily need at install time
|
||||||
|
sys.path = list(filter(
|
||||||
|
lambda p: not p.endswith("-packages")
|
||||||
|
or p.find(BOOTSTRAP_VENV_PREFIX) != -1,
|
||||||
|
sys.path
|
||||||
|
))
|
||||||
|
|
||||||
|
# determine site-packages/lib directory location for the venv
|
||||||
|
lib = "Lib" if OS == "Windows" else f"lib/python{sys.version_info.major}.{sys.version_info.minor}"
|
||||||
|
|
||||||
|
# add the site-packages location to the venv
|
||||||
|
sys.path.append(str(Path(venv_path, lib, "site-packages").expanduser().resolve()))
|
||||||
|
|
||||||
|
|
||||||
|
def get_torch_source() -> (Union[str, None],str):
|
||||||
|
"""
|
||||||
|
Determine the extra index URL for pip to use for torch installation.
|
||||||
|
This depends on the OS and the graphics accelerator in use.
|
||||||
|
This is only applicable to Windows and Linux, since PyTorch does not
|
||||||
|
offer accelerated builds for macOS.
|
||||||
|
|
||||||
|
Prefer CUDA-enabled wheels if the user wasn't sure of their GPU, as it will fallback to CPU if possible.
|
||||||
|
|
||||||
|
A NoneType return means just go to PyPi.
|
||||||
|
|
||||||
|
:return: tuple consisting of (extra index url or None, optional modules to load or None)
|
||||||
|
:rtype: list
|
||||||
|
"""
|
||||||
|
|
||||||
|
from messages import graphical_accelerator
|
||||||
|
|
||||||
|
# device can be one of: "cuda", "rocm", "cpu", "idk"
|
||||||
|
device = graphical_accelerator()
|
||||||
|
|
||||||
|
url = None
|
||||||
|
optional_modules = None
|
||||||
|
if OS == "Linux":
|
||||||
|
if device == "rocm":
|
||||||
|
url = "https://download.pytorch.org/whl/rocm5.2"
|
||||||
|
elif device == "cpu":
|
||||||
|
url = "https://download.pytorch.org/whl/cpu"
|
||||||
|
|
||||||
|
if device == 'cuda':
|
||||||
|
optional_modules = '[xformers]'
|
||||||
|
|
||||||
|
# in all other cases, Torch wheels should be coming from PyPi as of Torch 1.13
|
||||||
|
|
||||||
|
return (url, optional_modules)
|
54
installer/main.py
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
"""
|
||||||
|
InvokeAI Installer
|
||||||
|
"""
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
from pathlib import Path
|
||||||
|
from installer import Installer
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
"-r",
|
||||||
|
"--root",
|
||||||
|
dest="root",
|
||||||
|
type=str,
|
||||||
|
help="Destination path for installation",
|
||||||
|
default="~/invokeai",
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-y",
|
||||||
|
"--yes",
|
||||||
|
"--yes-to-all",
|
||||||
|
dest="yes_to_all",
|
||||||
|
action="store_true",
|
||||||
|
help="Assume default answers to all questions",
|
||||||
|
default=False,
|
||||||
|
)
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
"--version",
|
||||||
|
dest="version",
|
||||||
|
help="Version of InvokeAI to install. Default to the latest stable release. A special 'pre' value will install the latest published pre-release version.",
|
||||||
|
default=None,
|
||||||
|
)
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
"--find-links",
|
||||||
|
dest="find_links",
|
||||||
|
help="Specifies a directory of local wheel files to be searched prior to searching the online repositories.",
|
||||||
|
type=Path,
|
||||||
|
default=None,
|
||||||
|
)
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
inst = Installer()
|
||||||
|
|
||||||
|
try:
|
||||||
|
inst.install(**args.__dict__)
|
||||||
|
except KeyboardInterrupt as exc:
|
||||||
|
print("\n")
|
||||||
|
print("Ctrl-C pressed. Aborting.")
|
||||||
|
print("Come back soon!")
|
296
installer/messages.py
Normal file
@ -0,0 +1,296 @@
|
|||||||
|
# Copyright (c) 2023 Eugene Brodsky (https://github.com/ebr)
|
||||||
|
"""
|
||||||
|
Installer user interaction
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import platform
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from prompt_toolkit import prompt
|
||||||
|
from prompt_toolkit.completion import PathCompleter
|
||||||
|
from prompt_toolkit.shortcuts import CompleteStyle
|
||||||
|
from prompt_toolkit.validation import Validator
|
||||||
|
from rich import box, print
|
||||||
|
from rich.console import Console, Group
|
||||||
|
from rich.panel import Panel
|
||||||
|
from rich.prompt import Confirm
|
||||||
|
from rich.style import Style
|
||||||
|
from rich.syntax import Syntax
|
||||||
|
from rich.text import Text
|
||||||
|
|
||||||
|
"""
|
||||||
|
INVOKE_AI_SRC=https://github.com/invoke-ai/InvokeAI/archive/refs/tags/${INVOKEAI_VERSION}.zip
|
||||||
|
INSTRUCTIONS=https://invoke-ai.github.io/InvokeAI/installation/INSTALL_AUTOMATED/
|
||||||
|
TROUBLESHOOTING=https://invoke-ai.github.io/InvokeAI/installation/INSTALL_AUTOMATED/#troubleshooting
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
OS = platform.uname().system
|
||||||
|
ARCH = platform.uname().machine
|
||||||
|
|
||||||
|
if OS == "Windows":
|
||||||
|
# Windows terminals look better without a background colour
|
||||||
|
console = Console(style=Style(color="grey74"))
|
||||||
|
else:
|
||||||
|
console = Console(style=Style(color="grey74", bgcolor="grey19"))
|
||||||
|
|
||||||
|
|
||||||
|
def welcome():
|
||||||
|
console.rule()
|
||||||
|
print(
|
||||||
|
Panel(
|
||||||
|
title="[bold wheat1]Welcome to the InvokeAI Installer",
|
||||||
|
renderable=Text(
|
||||||
|
"Some of the installation steps take a long time to run. Please be patient. If the script appears to hang for more than 10 minutes, please interrupt with control-C and retry.",
|
||||||
|
justify="center",
|
||||||
|
),
|
||||||
|
box=box.DOUBLE,
|
||||||
|
width=80,
|
||||||
|
expand=False,
|
||||||
|
padding=(1, 2),
|
||||||
|
style=Style(bgcolor="grey23", color="orange1"),
|
||||||
|
subtitle=f"[bold grey39]{OS}-{ARCH}",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
console.line()
|
||||||
|
|
||||||
|
def confirm_install(dest: Path) -> bool:
|
||||||
|
if dest.exists():
|
||||||
|
print(f":exclamation: Directory {dest} already exists :exclamation:")
|
||||||
|
dest_confirmed = Confirm.ask(
|
||||||
|
":stop_sign: Are you sure you want to (re)install in this location?",
|
||||||
|
default=False,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
print(f"InvokeAI will be installed in {dest}")
|
||||||
|
dest_confirmed = not Confirm.ask(f"Would you like to pick a different location?", default=False)
|
||||||
|
console.line()
|
||||||
|
|
||||||
|
return dest_confirmed
|
||||||
|
|
||||||
|
|
||||||
|
def dest_path(dest=None) -> Path:
|
||||||
|
"""
|
||||||
|
Prompt the user for the destination path and create the path
|
||||||
|
|
||||||
|
:param dest: a filesystem path, defaults to None
|
||||||
|
:type dest: str, optional
|
||||||
|
:return: absolute path to the created installation directory
|
||||||
|
:rtype: Path
|
||||||
|
"""
|
||||||
|
|
||||||
|
if dest is not None:
|
||||||
|
dest = Path(dest).expanduser().resolve()
|
||||||
|
else:
|
||||||
|
dest = Path.cwd().expanduser().resolve()
|
||||||
|
prev_dest = dest.expanduser().resolve()
|
||||||
|
|
||||||
|
dest_confirmed = confirm_install(dest)
|
||||||
|
|
||||||
|
while not dest_confirmed:
|
||||||
|
|
||||||
|
# if the given destination already exists, the starting point for browsing is its parent directory.
|
||||||
|
# the user may have made a typo, or otherwise wants to place the root dir next to an existing one.
|
||||||
|
# if the destination dir does NOT exist, then the user must have changed their mind about the selection.
|
||||||
|
# since we can't read their mind, start browsing at Path.cwd().
|
||||||
|
browse_start = (prev_dest.parent if prev_dest.exists() else Path.cwd()).expanduser().resolve()
|
||||||
|
|
||||||
|
path_completer = PathCompleter(
|
||||||
|
only_directories=True,
|
||||||
|
expanduser=True,
|
||||||
|
get_paths=lambda: [browse_start],
|
||||||
|
# get_paths=lambda: [".."].extend(list(browse_start.iterdir()))
|
||||||
|
)
|
||||||
|
|
||||||
|
console.line()
|
||||||
|
print(f"[orange3]Please select the destination directory for the installation:[/] \[{browse_start}]: ")
|
||||||
|
selected = prompt(
|
||||||
|
f">>> ",
|
||||||
|
complete_in_thread=True,
|
||||||
|
completer=path_completer,
|
||||||
|
default=str(browse_start) + os.sep,
|
||||||
|
vi_mode=True,
|
||||||
|
complete_while_typing=True
|
||||||
|
# Test that this is not needed on Windows
|
||||||
|
# complete_style=CompleteStyle.READLINE_LIKE,
|
||||||
|
)
|
||||||
|
prev_dest = dest
|
||||||
|
dest = Path(selected)
|
||||||
|
console.line()
|
||||||
|
|
||||||
|
dest_confirmed = confirm_install(dest.expanduser().resolve())
|
||||||
|
|
||||||
|
if not dest_confirmed:
|
||||||
|
dest = prev_dest
|
||||||
|
|
||||||
|
dest = dest.expanduser().resolve()
|
||||||
|
|
||||||
|
try:
|
||||||
|
dest.mkdir(exist_ok=True, parents=True)
|
||||||
|
return dest
|
||||||
|
except PermissionError as exc:
|
||||||
|
print(
|
||||||
|
f"Failed to create directory {dest} due to insufficient permissions",
|
||||||
|
style=Style(color="red"),
|
||||||
|
highlight=True,
|
||||||
|
)
|
||||||
|
except OSError as exc:
|
||||||
|
console.print_exception(exc)
|
||||||
|
|
||||||
|
if Confirm.ask("Would you like to try again?"):
|
||||||
|
dest_path(init_path)
|
||||||
|
else:
|
||||||
|
console.rule("Goodbye!")
|
||||||
|
|
||||||
|
|
||||||
|
def graphical_accelerator():
|
||||||
|
"""
|
||||||
|
Prompt the user to select the graphical accelerator in their system
|
||||||
|
This does not validate user's choices (yet), but only offers choices
|
||||||
|
valid for the platform.
|
||||||
|
CUDA is the fallback.
|
||||||
|
We may be able to detect the GPU driver by shelling out to `modprobe` or `lspci`,
|
||||||
|
but this is not yet supported or reliable. Also, some users may have exotic preferences.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if ARCH == "arm64" and OS != "Darwin":
|
||||||
|
print(f"Only CPU acceleration is available on {ARCH} architecture. Proceeding with that.")
|
||||||
|
return "cpu"
|
||||||
|
|
||||||
|
nvidia = (
|
||||||
|
"an [gold1 b]NVIDIA[/] GPU (using CUDA™)",
|
||||||
|
"cuda",
|
||||||
|
)
|
||||||
|
amd = (
|
||||||
|
"an [gold1 b]AMD[/] GPU (using ROCm™)",
|
||||||
|
"rocm",
|
||||||
|
)
|
||||||
|
cpu = (
|
||||||
|
"no compatible GPU, or specifically prefer to use the CPU",
|
||||||
|
"cpu",
|
||||||
|
)
|
||||||
|
idk = (
|
||||||
|
"I'm not sure what to choose",
|
||||||
|
"idk",
|
||||||
|
)
|
||||||
|
|
||||||
|
if OS == "Windows":
|
||||||
|
options = [nvidia, cpu]
|
||||||
|
if OS == "Linux":
|
||||||
|
options = [nvidia, amd, cpu]
|
||||||
|
elif OS == "Darwin":
|
||||||
|
options = [cpu]
|
||||||
|
# future CoreML?
|
||||||
|
|
||||||
|
if len(options) == 1:
|
||||||
|
print(f'Your platform [gold1]{OS}-{ARCH}[/] only supports the "{options[0][1]}" driver. Proceeding with that.')
|
||||||
|
return options[0][1]
|
||||||
|
|
||||||
|
# "I don't know" is always added the last option
|
||||||
|
options.append(idk)
|
||||||
|
|
||||||
|
options = {str(i): opt for i, opt in enumerate(options, 1)}
|
||||||
|
|
||||||
|
console.rule(":space_invader: GPU (Graphics Card) selection :space_invader:")
|
||||||
|
console.print(
|
||||||
|
Panel(
|
||||||
|
Group(
|
||||||
|
"\n".join(
|
||||||
|
[
|
||||||
|
f"Detected the [gold1]{OS}-{ARCH}[/] platform",
|
||||||
|
"",
|
||||||
|
"See [steel_blue3]https://invoke-ai.github.io/InvokeAI/#system[/] to ensure your system meets the minimum requirements.",
|
||||||
|
"",
|
||||||
|
"[red3]🠶[/] [b]Your GPU drivers must be correctly installed before using InvokeAI![/] [red3]🠴[/]",
|
||||||
|
]
|
||||||
|
),
|
||||||
|
"",
|
||||||
|
"Please select the type of GPU installed in your computer.",
|
||||||
|
Panel(
|
||||||
|
"\n".join([f"[dark_goldenrod b i]{i}[/] [dark_red]🢒[/]{opt[0]}" for (i, opt) in options.items()]),
|
||||||
|
box=box.MINIMAL,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
box=box.MINIMAL,
|
||||||
|
padding=(1, 1),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
choice = prompt(
|
||||||
|
"Please make your selection: ",
|
||||||
|
validator=Validator.from_callable(
|
||||||
|
lambda n: n in options.keys(), error_message="Please select one the above options"
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
if options[choice][1] == "idk":
|
||||||
|
console.print(
|
||||||
|
"No problem. We will try to install a version that [i]should[/i] be compatible. :crossed_fingers:"
|
||||||
|
)
|
||||||
|
|
||||||
|
return options[choice][1]
|
||||||
|
|
||||||
|
|
||||||
|
def simple_banner(message: str) -> None:
|
||||||
|
"""
|
||||||
|
A simple banner with a message, defined here for styling consistency
|
||||||
|
|
||||||
|
:param message: The message to display
|
||||||
|
:type message: str
|
||||||
|
"""
|
||||||
|
|
||||||
|
console.rule(message)
|
||||||
|
|
||||||
|
|
||||||
|
# TODO this does not yet work correctly
|
||||||
|
def windows_long_paths_registry() -> None:
|
||||||
|
"""
|
||||||
|
Display a message about applying the Windows long paths registry fix
|
||||||
|
"""
|
||||||
|
|
||||||
|
with open(str(Path(__file__).parent / "WinLongPathsEnabled.reg"), "r", encoding="utf-16le") as code:
|
||||||
|
syntax = Syntax(code.read(), line_numbers=True)
|
||||||
|
|
||||||
|
console.print(
|
||||||
|
Panel(
|
||||||
|
Group(
|
||||||
|
"\n".join(
|
||||||
|
[
|
||||||
|
"We will now apply a registry fix to enable long paths on Windows. InvokeAI needs this to function correctly. We are asking your permission to modify the Windows Registry on your behalf.",
|
||||||
|
"",
|
||||||
|
"This is the change that will be applied:",
|
||||||
|
syntax,
|
||||||
|
]
|
||||||
|
)
|
||||||
|
),
|
||||||
|
title="Windows Long Paths registry fix",
|
||||||
|
box=box.HORIZONTALS,
|
||||||
|
padding=(1, 1),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def introduction() -> None:
|
||||||
|
"""
|
||||||
|
Display a banner when starting configuration of the InvokeAI application
|
||||||
|
"""
|
||||||
|
|
||||||
|
console.rule()
|
||||||
|
|
||||||
|
console.print(
|
||||||
|
Panel(
|
||||||
|
title=":art: Configuring InvokeAI :art:",
|
||||||
|
renderable=Group(
|
||||||
|
"",
|
||||||
|
"[b]This script will:",
|
||||||
|
"",
|
||||||
|
"1. Configure the InvokeAI application directory",
|
||||||
|
"2. Help download the Stable Diffusion weight files",
|
||||||
|
" and other large models that are needed for text to image generation",
|
||||||
|
"3. Create initial configuration files.",
|
||||||
|
"",
|
||||||
|
"[i]At any point you may interrupt this program and resume later.",
|
||||||
|
),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
console.line(2)
|
@ -43,8 +43,8 @@ Launching the installer:
|
|||||||
'./install.sh' (while keeping it inside the InvokeAI-Installer
|
'./install.sh' (while keeping it inside the InvokeAI-Installer
|
||||||
folder).
|
folder).
|
||||||
|
|
||||||
The installer will create a directory named "invokeai" in the folder
|
The installer will create a directory of your choice and install the
|
||||||
of your choice. This directory contains everything you need to run
|
InvokeAI application within it. This directory contains everything you need to run
|
||||||
invokeai. Once InvokeAI is up and running, you may delete the
|
invokeai. Once InvokeAI is up and running, you may delete the
|
||||||
InvokeAI-Installer folder at your convenience.
|
InvokeAI-Installer folder at your convenience.
|
||||||
|
|
||||||
|
@ -17,19 +17,19 @@ set /P restore="Please enter 1, 2, 3, 4 or 5: [5] "
|
|||||||
if not defined restore set restore=2
|
if not defined restore set restore=2
|
||||||
IF /I "%restore%" == "1" (
|
IF /I "%restore%" == "1" (
|
||||||
echo Starting the InvokeAI command-line..
|
echo Starting the InvokeAI command-line..
|
||||||
python .venv\Scripts\invoke %*
|
python .venv\Scripts\invokeai.exe %*
|
||||||
) ELSE IF /I "%restore%" == "2" (
|
) ELSE IF /I "%restore%" == "2" (
|
||||||
echo Starting the InvokeAI browser-based UI..
|
echo Starting the InvokeAI browser-based UI..
|
||||||
python .venv\Scripts\invoke --web %*
|
python .venv\Scripts\invokeai.exe --web %*
|
||||||
) ELSE IF /I "%restore%" == "3" (
|
) ELSE IF /I "%restore%" == "3" (
|
||||||
echo Starting textual inversion training..
|
echo Starting textual inversion training..
|
||||||
python .venv\Scripts\textual_inversion --gui %*
|
python .venv\Scripts\invokeai-ti.exe --gui %*
|
||||||
) ELSE IF /I "%restore%" == "4" (
|
) ELSE IF /I "%restore%" == "4" (
|
||||||
echo Starting model merging script..
|
echo Starting model merging script..
|
||||||
python .venv\Scripts\merge_models --gui %*
|
python .venv\Scripts\invokeai-merge.exe --gui %*
|
||||||
) ELSE IF /I "%restore%" == "5" (
|
) ELSE IF /I "%restore%" == "5" (
|
||||||
echo Running configure_invokeai.py...
|
echo Running invokeai-configure...
|
||||||
python .venv\Scripts\configure_invokeai %*
|
python .venv\Scripts\invokeai-configure.exe %*
|
||||||
) ELSE IF /I "%restore%" == "6" (
|
) ELSE IF /I "%restore%" == "6" (
|
||||||
echo Developer Console
|
echo Developer Console
|
||||||
echo Python command is:
|
echo Python command is:
|
||||||
|
@ -1,5 +1,14 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
####
|
||||||
|
# This launch script assumes that:
|
||||||
|
# 1. it is located in the runtime directory,
|
||||||
|
# 2. the .venv is also located in the runtime directory and is named exactly that
|
||||||
|
#
|
||||||
|
# If both of the above are not true, this script will likely not work as intended.
|
||||||
|
# Activate the virtual environment and run `invoke.py` directly.
|
||||||
|
####
|
||||||
|
|
||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
# ensure we're in the correct folder in case user's CWD is somewhere else
|
# ensure we're in the correct folder in case user's CWD is somewhere else
|
||||||
@ -23,16 +32,41 @@ if [ "$0" != "bash" ]; then
|
|||||||
echo "4. merge models (diffusers type only)"
|
echo "4. merge models (diffusers type only)"
|
||||||
echo "5. open the developer console"
|
echo "5. open the developer console"
|
||||||
echo "6. re-run the configure script to download new models"
|
echo "6. re-run the configure script to download new models"
|
||||||
read -p "Please enter 1, 2, 3, 4 or 5: [1] " yn
|
echo "7. command-line help "
|
||||||
|
echo ""
|
||||||
|
read -p "Please enter 1, 2, 3, 4, 5, 6 or 7: [2] " yn
|
||||||
choice=${yn:='2'}
|
choice=${yn:='2'}
|
||||||
case $choice in
|
case $choice in
|
||||||
1 ) printf "\nStarting the InvokeAI command-line..\n"; invoke $*;;
|
1)
|
||||||
2 ) printf "\nStarting the InvokeAI browser-based UI..\n"; invoke --web $*;;
|
echo "Starting the InvokeAI command-line..."
|
||||||
3 ) printf "\nStarting Textual Inversion:\n"; textual_inversion --gui $*;;
|
exec invokeai $@
|
||||||
4 ) printf "\nMerging Models:\n"; merge_models --gui $*;;
|
;;
|
||||||
5 ) printf "\nDeveloper Console:\n"; file_name=$(basename "${BASH_SOURCE[0]}"); bash --init-file "$file_name";;
|
2)
|
||||||
6 ) printf "\nRunning configure_invokeai.py:\n"; configure_invokeai $*;;
|
echo "Starting the InvokeAI browser-based UI..."
|
||||||
* ) echo "Invalid selection"; exit;;
|
exec invokeai --web $@
|
||||||
|
;;
|
||||||
|
3)
|
||||||
|
echo "Starting Textual Inversion:"
|
||||||
|
exec textual_inversion --gui $@
|
||||||
|
;;
|
||||||
|
4)
|
||||||
|
echo "Merging Models:"
|
||||||
|
exec merge_models --gui $@
|
||||||
|
;;
|
||||||
|
5)
|
||||||
|
echo "Developer Console:"
|
||||||
|
file_name=$(basename "${BASH_SOURCE[0]}")
|
||||||
|
bash --init-file "$file_name"
|
||||||
|
;;
|
||||||
|
6)
|
||||||
|
exec invokeai-configure --root ${INVOKEAI_ROOT}
|
||||||
|
;;
|
||||||
|
7)
|
||||||
|
exec invokeai --help
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Invalid selection"
|
||||||
|
exit;;
|
||||||
esac
|
esac
|
||||||
else # in developer console
|
else # in developer console
|
||||||
python --version
|
python --version
|
||||||
|
@ -57,7 +57,7 @@ if %errorlevel% neq 0 (
|
|||||||
exit /b
|
exit /b
|
||||||
)
|
)
|
||||||
|
|
||||||
@rem call .venv\Scripts\python .venv\Scripts\configure_invokeai.py --root=.
|
@rem call .venv\Scripts\invokeai-configure --root=.
|
||||||
|
|
||||||
@rem if %errorlevel% neq 0 (
|
@rem if %errorlevel% neq 0 (
|
||||||
@rem echo Configuration InvokeAI failed. See https://invoke-ai.github.io/InvokeAI/installation/INSTALL_AUTOMATED/#troubleshooting for suggestions.
|
@rem echo Configuration InvokeAI failed. See https://invoke-ai.github.io/InvokeAI/installation/INSTALL_AUTOMATED/#troubleshooting for suggestions.
|
||||||
@ -70,4 +70,3 @@ echo InvokeAI has been updated to '%INVOKE_AI_VERSION%'
|
|||||||
echo "Press any key to continue"
|
echo "Press any key to continue"
|
||||||
pause
|
pause
|
||||||
endlocal
|
endlocal
|
||||||
|
|
||||||
|
@ -56,6 +56,3 @@ _err_exit $? "The pip program failed to install InvokeAI's requirements."
|
|||||||
_err_exit $? "The pip program failed to install InvokeAI."
|
_err_exit $? "The pip program failed to install InvokeAI."
|
||||||
|
|
||||||
echo InvokeAI updated to \'$INVOKE_AI_VERSION\'
|
echo InvokeAI updated to \'$INVOKE_AI_VERSION\'
|
||||||
|
|
||||||
# ./.venv/bin/python .venv/bin/configure_invokeai.py --root .
|
|
||||||
# _err_exit $? "The configure script failed to run successfully."
|
|
||||||
|
3
invokeai/README
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
After version 2.3 is released, the ldm/invoke modules will be migrated to this location
|
||||||
|
so that we have a proper invokeai distribution. Currently it is only being used for
|
||||||
|
data files.
|
Before Width: | Height: | Size: 651 KiB After Width: | Height: | Size: 651 KiB |
Before Width: | Height: | Size: 596 KiB After Width: | Height: | Size: 596 KiB |
Before Width: | Height: | Size: 609 KiB After Width: | Height: | Size: 609 KiB |
Before Width: | Height: | Size: 548 KiB After Width: | Height: | Size: 548 KiB |
Before Width: | Height: | Size: 705 KiB After Width: | Height: | Size: 705 KiB |
Before Width: | Height: | Size: 757 KiB After Width: | Height: | Size: 757 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 466 KiB After Width: | Height: | Size: 466 KiB |
Before Width: | Height: | Size: 7.4 KiB After Width: | Height: | Size: 7.4 KiB |
Before Width: | Height: | Size: 539 KiB After Width: | Height: | Size: 539 KiB |
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 7.6 KiB |
Before Width: | Height: | Size: 450 KiB After Width: | Height: | Size: 450 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 553 KiB After Width: | Height: | Size: 553 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 418 KiB After Width: | Height: | Size: 418 KiB |
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 6.1 KiB |
Before Width: | Height: | Size: 542 KiB After Width: | Height: | Size: 542 KiB |
Before Width: | Height: | Size: 9.5 KiB After Width: | Height: | Size: 9.5 KiB |
Before Width: | Height: | Size: 395 KiB After Width: | Height: | Size: 395 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 465 KiB After Width: | Height: | Size: 465 KiB |
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 7.8 KiB |
Before Width: | Height: | Size: 612 KiB After Width: | Height: | Size: 612 KiB |
Before Width: | Height: | Size: 312 KiB After Width: | Height: | Size: 312 KiB |
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 72 KiB |
Before Width: | Height: | Size: 319 KiB After Width: | Height: | Size: 319 KiB |
Before Width: | Height: | Size: 788 KiB After Width: | Height: | Size: 788 KiB |
Before Width: | Height: | Size: 958 KiB After Width: | Height: | Size: 958 KiB |
Before Width: | Height: | Size: 9.4 MiB After Width: | Height: | Size: 9.4 MiB |
Before Width: | Height: | Size: 610 KiB After Width: | Height: | Size: 610 KiB |
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.1 MiB |
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.3 MiB |
Before Width: | Height: | Size: 945 KiB After Width: | Height: | Size: 945 KiB |
Before Width: | Height: | Size: 972 KiB After Width: | Height: | Size: 972 KiB |
Before Width: | Height: | Size: 662 KiB After Width: | Height: | Size: 662 KiB |
Before Width: | Height: | Size: 302 KiB After Width: | Height: | Size: 302 KiB |
Before Width: | Height: | Size: 2.2 MiB After Width: | Height: | Size: 2.2 MiB |
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 33 KiB |
5
invokeai/backend/__init__.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
'''
|
||||||
|
Initialization file for invokeai.backend
|
||||||
|
'''
|
||||||
|
from .invoke_ai_web_server import InvokeAIWebServer
|
||||||
|
|
@ -11,16 +11,18 @@ from threading import Event
|
|||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
|
|
||||||
import eventlet
|
import eventlet
|
||||||
|
from pathlib import Path
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
from PIL.Image import Image as ImageType
|
from PIL.Image import Image as ImageType
|
||||||
from flask import Flask, redirect, send_from_directory, request, make_response
|
from flask import Flask, redirect, send_from_directory, request, make_response
|
||||||
from flask_socketio import SocketIO
|
from flask_socketio import SocketIO
|
||||||
from werkzeug.utils import secure_filename
|
from werkzeug.utils import secure_filename
|
||||||
|
|
||||||
from backend.modules.get_canvas_generation_mode import (
|
from invokeai.backend.modules.get_canvas_generation_mode import (
|
||||||
get_canvas_generation_mode,
|
get_canvas_generation_mode,
|
||||||
)
|
)
|
||||||
from backend.modules.parameters import parameters_to_command
|
from invokeai.backend.modules.parameters import parameters_to_command
|
||||||
|
import invokeai.frontend.dist as frontend
|
||||||
from ldm.generate import Generate
|
from ldm.generate import Generate
|
||||||
from ldm.invoke.args import Args, APP_ID, APP_VERSION, calculate_init_img_hash
|
from ldm.invoke.args import Args, APP_ID, APP_VERSION, calculate_init_img_hash
|
||||||
from ldm.invoke.conditioning import get_tokens_for_prompt, get_prompt_structure
|
from ldm.invoke.conditioning import get_tokens_for_prompt, get_prompt_structure
|
||||||
@ -93,9 +95,8 @@ class InvokeAIWebServer:
|
|||||||
_cors = _cors.split(",")
|
_cors = _cors.split(",")
|
||||||
socketio_args["cors_allowed_origins"] = _cors
|
socketio_args["cors_allowed_origins"] = _cors
|
||||||
|
|
||||||
frontend_path = self.find_frontend()
|
|
||||||
self.app = Flask(
|
self.app = Flask(
|
||||||
__name__, static_url_path="", static_folder=frontend_path
|
__name__, static_url_path="", static_folder=frontend.__path__[0]
|
||||||
)
|
)
|
||||||
|
|
||||||
self.socketio = SocketIO(self.app, **socketio_args)
|
self.socketio = SocketIO(self.app, **socketio_args)
|
||||||
@ -253,18 +254,6 @@ class InvokeAIWebServer:
|
|||||||
keyfile=args.keyfile,
|
keyfile=args.keyfile,
|
||||||
)
|
)
|
||||||
|
|
||||||
def find_frontend(self):
|
|
||||||
my_dir = os.path.dirname(__file__)
|
|
||||||
# LS: setup.py seems to put the frontend in different places on different systems, so
|
|
||||||
# this is fragile and needs to be replaced with a better way of finding the front end.
|
|
||||||
for candidate in (os.path.join(my_dir,'..','frontend','dist'), # pip install -e .
|
|
||||||
os.path.join(my_dir,'../../../../frontend','dist'), # pip install . (Linux, Mac)
|
|
||||||
os.path.join(my_dir,'../../../frontend','dist'), # pip install . (Windows)
|
|
||||||
):
|
|
||||||
if os.path.exists(candidate):
|
|
||||||
return candidate
|
|
||||||
assert "Frontend files cannot be found. Cannot continue"
|
|
||||||
|
|
||||||
def setup_app(self):
|
def setup_app(self):
|
||||||
self.result_url = "outputs/"
|
self.result_url = "outputs/"
|
||||||
self.init_image_url = "outputs/init-images/"
|
self.init_image_url = "outputs/init-images/"
|
0
invokeai/backend/modules/__init__.py
Normal file
@ -1,4 +1,4 @@
|
|||||||
from backend.modules.parse_seed_weights import parse_seed_weights
|
from invokeai.backend.modules.parse_seed_weights import parse_seed_weights
|
||||||
import argparse
|
import argparse
|
||||||
|
|
||||||
SAMPLER_CHOICES = [
|
SAMPLER_CHOICES = [
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 292 KiB After Width: | Height: | Size: 292 KiB |
Before Width: | Height: | Size: 164 KiB After Width: | Height: | Size: 164 KiB |
Before Width: | Height: | Size: 9.5 KiB After Width: | Height: | Size: 9.5 KiB |
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
@ -1,69 +1,63 @@
|
|||||||
stable-diffusion-2.1-768:
|
|
||||||
description: Stable Diffusion version 2.1 diffusers model, trained on 768x768 images (5.21 GB)
|
|
||||||
repo_id: stabilityai/stable-diffusion-2-1
|
|
||||||
format: diffusers
|
|
||||||
recommended: True
|
|
||||||
stable-diffusion-2.1-base:
|
|
||||||
description: Stable Diffusion version 2.1 diffusers base model, trained on 512x512 images (5.21 GB)
|
|
||||||
repo_id: stabilityai/stable-diffusion-2-1-base
|
|
||||||
format: diffusers
|
|
||||||
recommended: False
|
|
||||||
stable-diffusion-1.5:
|
stable-diffusion-1.5:
|
||||||
description: Stable Diffusion version 1.5 weight file (4.27 GB)
|
description: Stable Diffusion version 1.5 weight file (4.27 GB)
|
||||||
repo_id: runwayml/stable-diffusion-v1-5
|
repo_id: runwayml/stable-diffusion-v1-5
|
||||||
format: diffusers
|
format: diffusers
|
||||||
recommended: True
|
|
||||||
default: True
|
|
||||||
vae:
|
vae:
|
||||||
repo_id: stabilityai/sd-vae-ft-mse
|
repo_id: stabilityai/sd-vae-ft-mse
|
||||||
stable-diffusion-1.4:
|
|
||||||
description: The original Stable Diffusion version 1.4 weight file (4.27 GB)
|
|
||||||
repo_id: CompVis/stable-diffusion-v1-4
|
|
||||||
recommended: False
|
|
||||||
format: diffusers
|
|
||||||
vae:
|
|
||||||
repo_id: stabilityai/sd-vae-ft-mse
|
|
||||||
width: 512
|
|
||||||
height: 512
|
|
||||||
inpainting-1.5:
|
|
||||||
description: RunwayML SD 1.5 model optimized for inpainting (ckpt version) (4.27 GB)
|
|
||||||
repo_id: runwayml/stable-diffusion-inpainting
|
|
||||||
config: v1-inpainting-inference.yaml
|
|
||||||
file: sd-v1-5-inpainting.ckpt
|
|
||||||
format: ckpt
|
|
||||||
vae:
|
|
||||||
repo_id: stabilityai/sd-vae-ft-mse-original
|
|
||||||
file: vae-ft-mse-840000-ema-pruned.ckpt
|
|
||||||
recommended: True
|
recommended: True
|
||||||
width: 512
|
default: True
|
||||||
height: 512
|
inpainting-1.5:
|
||||||
waifu-diffusion-1.4:
|
description: RunwayML SD 1.5 model optimized for inpainting (4.27 GB)
|
||||||
description: Latest waifu diffusion 1.4 (diffusers version)
|
repo_id: runwayml/stable-diffusion-inpainting
|
||||||
format: diffusers
|
format: diffusers
|
||||||
repo_id: hakurei/waifu-diffusion
|
|
||||||
vae:
|
vae:
|
||||||
repo_id: stabilityai/sd-vae-ft-mse
|
repo_id: stabilityai/sd-vae-ft-mse
|
||||||
recommended: True
|
recommended: True
|
||||||
waifu-diffusion-1.3:
|
dreamlike-diffusion-1.0:
|
||||||
description: Stable Diffusion 1.4 fine tuned on anime-styled images (ckpt version) (4.27 GB)
|
description: An SD 1.5 model fine tuned on high quality art by dreamlike.art
|
||||||
repo_id: hakurei/waifu-diffusion-v1-3
|
format: diffusers
|
||||||
config: v1-inference.yaml
|
repo_id: dreamlike-art/dreamlike-diffusion-1.0
|
||||||
file: model-epoch09-float32.ckpt
|
vae:
|
||||||
format: ckpt
|
repo_id: stabilityai/sd-vae-ft-mse
|
||||||
vae:
|
recommended: True
|
||||||
repo_id: stabilityai/sd-vae-ft-mse-original
|
dreamlike-photoreal-2.0:
|
||||||
file: vae-ft-mse-840000-ema-pruned.ckpt
|
description: A photorealistic model trained on 768 pixel images based on SD 1.5 (2.13 GB)
|
||||||
|
format: diffusers
|
||||||
|
repo_id: dreamlike-art/dreamlike-photoreal-2.0
|
||||||
|
recommended: False
|
||||||
|
stable-diffusion-2.1-768:
|
||||||
|
description: Stable Diffusion version 2.1 diffusers model, trained on 768 pixel images (5.21 GB)
|
||||||
|
repo_id: stabilityai/stable-diffusion-2-1
|
||||||
|
format: diffusers
|
||||||
|
recommended: True
|
||||||
|
stable-diffusion-2.1-base:
|
||||||
|
description: Stable Diffusion version 2.1 diffusers base model, trained on 512 pixel images (5.21 GB)
|
||||||
|
repo_id: stabilityai/stable-diffusion-2-1-base
|
||||||
|
format: diffusers
|
||||||
recommended: False
|
recommended: False
|
||||||
width: 512
|
openjourney-4.0:
|
||||||
height: 512
|
description: An SD 1.5 model fine tuned on Midjourney images by PromptHero - include "mdjrny-v4 style" in your prompts (2.13 GB)
|
||||||
|
format: diffusers
|
||||||
|
repo_id: prompthero/openjourney
|
||||||
|
vae:
|
||||||
|
repo_id: stabilityai/sd-vae-ft-mse
|
||||||
|
recommended: False
|
||||||
|
nitro-diffusion-1.0:
|
||||||
|
description: A SD 1.5 model trained on three artstyles - prompt with "archer style", "arcane style" and/or "modern disney style" (2.13 GB)
|
||||||
|
repo_id: nitrosocke/Nitro-Diffusion
|
||||||
|
format: diffusers
|
||||||
|
vae:
|
||||||
|
repo_id: stabilityai/sd-vae-ft-mse
|
||||||
|
recommended: False
|
||||||
|
|
||||||
trinart-2.0:
|
trinart-2.0:
|
||||||
description: An SD model finetuned with ~40,000 assorted high resolution manga/anime-style pictures (2.13 GB)
|
description: An SD model finetuned with ~40,000 assorted high resolution manga/anime-style pictures (2.13 GB)
|
||||||
repo_id: naclbit/trinart_stable_diffusion_v2
|
repo_id: naclbit/trinart_stable_diffusion_v2
|
||||||
format: diffusers
|
format: diffusers
|
||||||
recommended: False
|
|
||||||
vae:
|
vae:
|
||||||
repo_id: stabilityai/sd-vae-ft-mse
|
repo_id: stabilityai/sd-vae-ft-mse
|
||||||
trinart_characters-2_0:
|
recommended: False
|
||||||
|
trinart-characters-2_0:
|
||||||
description: An SD model finetuned with 19.2M anime/manga style images (ckpt version) (4.27 GB)
|
description: An SD model finetuned with 19.2M anime/manga style images (ckpt version) (4.27 GB)
|
||||||
repo_id: naclbit/trinart_derrida_characters_v2_stable_diffusion
|
repo_id: naclbit/trinart_derrida_characters_v2_stable_diffusion
|
||||||
config: v1-inference.yaml
|
config: v1-inference.yaml
|
||||||
@ -72,50 +66,24 @@ trinart_characters-2_0:
|
|||||||
vae:
|
vae:
|
||||||
repo_id: naclbit/trinart_derrida_characters_v2_stable_diffusion
|
repo_id: naclbit/trinart_derrida_characters_v2_stable_diffusion
|
||||||
file: autoencoder_fix_kl-f8-trinart_characters.ckpt
|
file: autoencoder_fix_kl-f8-trinart_characters.ckpt
|
||||||
recommended: False
|
|
||||||
width: 512
|
width: 512
|
||||||
height: 512
|
height: 512
|
||||||
anything-4.0:
|
|
||||||
description: High-quality, highly detailed anime style images with just a few prompts
|
|
||||||
format: diffusers
|
|
||||||
repo_id: andite/anything-v4.0
|
|
||||||
vae:
|
|
||||||
repo_id: stabilityai/sd-vae-ft-mse
|
|
||||||
recommended: False
|
recommended: False
|
||||||
papercut-1.0:
|
|
||||||
description: SD 1.5 fine-tuned for papercut art (use "PaperCut" in your prompts) (2.13 GB)
|
|
||||||
repo_id: Fictiverse/Stable_Diffusion_PaperCut_Model
|
|
||||||
format: diffusers
|
|
||||||
vae:
|
|
||||||
repo_id: stabilityai/sd-vae-ft-mse
|
|
||||||
recommended: False
|
|
||||||
voxel_art-1.0:
|
|
||||||
description: Stable Diffusion trained on voxel art (use "VoxelArt" in your prompts) (4.27 GB)
|
|
||||||
repo_id: Fictiverse/Stable_Diffusion_VoxelArt_Model
|
|
||||||
config: v1-inference.yaml
|
|
||||||
file: VoxelArt_v1.ckpt
|
|
||||||
format: ckpt
|
|
||||||
vae:
|
|
||||||
repo_id: stabilityai/sd-vae-ft-mse
|
|
||||||
file: vae-ft-mse-840000-ema-pruned.ckpt
|
|
||||||
recommended: False
|
|
||||||
width: 512
|
|
||||||
height: 512
|
|
||||||
ft-mse-improved-autoencoder-840000:
|
ft-mse-improved-autoencoder-840000:
|
||||||
description: StabilityAI improved autoencoder fine-tuned for human faces. Use with legacy .ckpt models ONLY (335 MB)
|
description: StabilityAI improved autoencoder fine-tuned for human faces. Improves legacy .ckpt models (335 MB)
|
||||||
repo_id: stabilityai/sd-vae-ft-mse-original
|
repo_id: stabilityai/sd-vae-ft-mse-original
|
||||||
format: ckpt
|
format: ckpt
|
||||||
config: VAE/default
|
config: VAE/default
|
||||||
file: vae-ft-mse-840000-ema-pruned.ckpt
|
file: vae-ft-mse-840000-ema-pruned.ckpt
|
||||||
recommended: True
|
|
||||||
width: 512
|
width: 512
|
||||||
height: 512
|
height: 512
|
||||||
|
recommended: True
|
||||||
trinart_vae:
|
trinart_vae:
|
||||||
description: Custom autoencoder for trinart_characters for legacy .ckpt models only (335 MB)
|
description: Custom autoencoder for trinart_characters for legacy .ckpt models only (335 MB)
|
||||||
repo_id: naclbit/trinart_characters_19.2m_stable_diffusion_v1
|
repo_id: naclbit/trinart_characters_19.2m_stable_diffusion_v1
|
||||||
config: VAE/trinart
|
config: VAE/trinart
|
||||||
format: ckpt
|
format: ckpt
|
||||||
file: autoencoder_fix_kl-f8-trinart_characters.ckpt
|
file: autoencoder_fix_kl-f8-trinart_characters.ckpt
|
||||||
recommended: False
|
|
||||||
width: 512
|
width: 512
|
||||||
height: 512
|
height: 512
|
||||||
|
recommended: False
|
Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 116 KiB |