2022-09-11 20:57:15 +00:00
SHELL := /bin/bash
2023-11-22 18:33:58 +00:00
python_version = 3.10.13
2022-09-11 20:57:15 +00:00
venv_prefix = imaginairy
venv_name = $( venv_prefix) -$( python_version)
pyenv_instructions = https://github.com/pyenv/pyenv#installation
pyenv_virt_instructions = https://github.com/pyenv/pyenv-virtualenv#pyenv-virtualenv
init : require_pyenv ## Setup a dev environment for local development.
@pyenv install $( python_version) -s
@echo -e " \033[0;32m ✔️ 🐍 $( python_version) installed \033[0m "
@if ! [ -d " $$ (pyenv root)/versions/ $( venv_name) " ] ; then \
pyenv virtualenv $( python_version) $( venv_name) ; \
fi ;
@pyenv local $( venv_name)
@echo -e " \033[0;32m ✔️ 🐍 $( venv_name) virtualenv activated \033[0m "
pip install --upgrade pip pip-tools
pip-sync requirements-dev.txt
2023-11-16 03:46:56 +00:00
pip install -e .
2023-01-09 06:03:16 +00:00
# the compiled requirements don't included OS specific subdependencies so we trigger those this way
2023-11-16 03:46:56 +00:00
#pip install `pip freeze | grep "^torch=="`
2022-09-11 20:57:15 +00:00
@echo -e "\nEnvironment setup! ✨ 🍰 ✨ 🐍 \n\nCopy this path to tell PyCharm where your virtualenv is. You may have to click the refresh button in the pycharm file explorer.\n"
@echo -e "\033[0;32m"
@pyenv which python
@echo -e "\n\033[0m"
@echo -e "The following commands are available to run in the Makefile\n"
@make -s help
af : autoformat ## Alias for `autoformat`
autoformat : ## Run the autoformatter.
2023-09-29 08:13:50 +00:00
@-ruff check --config tests/ruff.toml . --fix-only
2023-12-27 22:53:05 +00:00
@ruff format --config tests/ruff.toml .
2023-09-29 08:13:50 +00:00
2022-09-11 20:57:15 +00:00
test : ## Run the tests.
@pytest
@echo -e "The tests pass! ✨ 🍰 ✨"
2023-12-19 20:39:34 +00:00
test-fast : ## Run the fast tests.
@pytest -m "not gputest"
@echo -e "The non-gpu tests pass! ✨ 🍰 ✨"
2022-09-11 20:57:15 +00:00
lint : ## Run the code linter.
2023-09-29 08:13:50 +00:00
@ruff check --config tests/ruff.toml .
2022-09-11 20:57:15 +00:00
@echo -e "No linting errors - well done! ✨ 🍰 ✨"
2023-12-11 02:29:47 +00:00
type-check : ## Run the type checker.
@mypy --config-file tox.ini .
2023-12-19 20:39:34 +00:00
check-fast : ## Run autoformatter, linter, typechecker, and fast tests
@make autoformat
@make lint
@make type-check
@make test-fast
2024-01-04 03:51:22 +00:00
build-pkg : ## Build the package
python setup.py sdist bdist_wheel
python setup.py bdist_wheel --plat-name= win-amd64
2022-09-11 20:57:15 +00:00
deploy : ## Deploy the package to pypi.org
pip install twine wheel
-git tag $$ ( python setup.py -V)
git push --tags
2022-09-12 05:24:02 +00:00
rm -rf dist
2024-01-04 03:51:22 +00:00
make build-pkg
2022-09-12 05:22:43 +00:00
#python setup.py sdist
2023-11-23 02:33:28 +00:00
@twine upload --verbose dist/* -u __token__;
2022-09-11 20:57:15 +00:00
rm -rf build
rm -rf dist
@echo "Deploy successful! ✨ 🍰 ✨"
2022-09-22 05:03:12 +00:00
build-dev-image :
docker build -f tests/Dockerfile -t imaginairy-dev .
run-dev : build -dev -image
docker run -it -v $$ HOME/.cache/huggingface:/root/.cache/huggingface -v $$ HOME/.cache/torch:/root/.cache/torch -v ` pwd ` /outputs:/outputs imaginairy-dev /bin/bash
2022-09-11 20:57:15 +00:00
requirements : ## Freeze the requirements.txt file
2023-01-09 04:45:58 +00:00
pip-compile setup.py requirements-dev.in --output-file= requirements-dev.txt --upgrade --resolver= backtracking
2022-09-11 20:57:15 +00:00
require_pyenv :
@if ! [ -x " $$ (command -v pyenv) " ] ; then \
echo -e '\n\033[0;31m ❌ pyenv is not installed. Follow instructions here: $(pyenv_instructions)\n\033[0m' ; \
exit 1; \
else \
echo -e "\033[0;32m ✔️ pyenv installed\033[0m" ; \
fi
@if ! [ [ " $$ (pyenv virtualenv --version) " = = *"pyenv-virtualenv" * ] ] ; then \
echo -e '\n\033[0;31m ❌ pyenv virtualenv is not installed. Follow instructions here: $(pyenv_virt_instructions) \n\033[0m' ; \
exit 1; \
else \
echo -e "\033[0;32m ✔️ pyenv-virtualenv installed\033[0m" ; \
fi
2024-01-05 05:36:30 +00:00
.PHONY : docs
docs :
mkdocs serve
2023-05-22 09:02:00 +00:00
update-stablestudio :
@echo "Updating stablestudio"
cd ../imaginAIry-StableStudio && \
yarn build && \
yarn build:production
rm -rf imaginairy/http/stablestudio/dist
cp -R ../imaginAIry-StableStudio/packages/stablestudio-ui/dist imaginairy/http/stablestudio/dist
rm -rf imaginairy/http/stablestudio/dist/examples
rm -rf imaginairy/http/stablestudio/dist/media
rm -rf imaginairy/http/stablestudio/dist/presets
cp ../imaginAIry-StableStudio/LICENSE imaginairy/http/stablestudio/dist/LICENSE
@echo "Updated stablestudio"
2022-09-12 05:22:43 +00:00
vendor_openai_clip :
mkdir -p ./downloads
-cd ./downloads && git clone git@github.com:openai/CLIP.git
cd ./downloads/CLIP && git pull
rm -rf ./imaginairy/vendored/clip
cp -R ./downloads/CLIP/clip imaginairy/vendored/
git --git-dir ./downloads/CLIP/.git rev-parse HEAD | tee ./imaginairy/vendored/clip/clip-commit-hash.txt
echo "vendored from git@github.com:openai/CLIP.git" | tee ./imaginairy/vendored/clip/readme.txt
2022-09-18 00:02:45 +00:00
revendorize : vendorize_kdiffusion
2022-09-14 07:40:25 +00:00
make vendorize REPO = git@github.com:openai/CLIP.git PKG = clip COMMIT = d50d76daa670286dd6cacf3bcd80b5e4823fc8e1
2022-09-18 00:02:45 +00:00
make af
vendorize_clipseg :
2022-09-28 06:15:34 +00:00
make download_repo REPO = git@github.com:timojl/clipseg.git PKG = clipseg COMMIT = ea54753df1e444c4445bac6e023546b6a41951d8
2022-09-18 00:02:45 +00:00
rm -rf ./imaginairy/vendored/clipseg
mkdir -p ./imaginairy/vendored/clipseg
cp -R ./downloads/clipseg/models/* ./imaginairy/vendored/clipseg/
sed -i '' -e 's#import clip#from imaginairy.vendored import clip#g' ./imaginairy/vendored/clipseg/clipseg.py
rm ./imaginairy/vendored/clipseg/vitseg.py
mv ./imaginairy/vendored/clipseg/clipseg.py ./imaginairy/vendored/clipseg/__init__.py
2022-09-28 06:15:34 +00:00
# download weights
rm -rf ./downloads/clipseg-weights
mkdir -p ./downloads/clipseg-weights
wget https://owncloud.gwdg.de/index.php/s/ioHbRzFx6th32hn/download -O ./downloads/clipseg-weights/weights.tar
cd downloads/clipseg-weights && unzip -d weights -j weights.tar
cp ./downloads/clipseg-weights/weights/rd64-uni-refined.pth ./imaginairy/vendored/clipseg/
2022-09-18 00:02:45 +00:00
2022-09-20 04:15:38 +00:00
vendorize_blip :
make download_repo REPO = git@github.com:salesforce/BLIP.git PKG = blip COMMIT = 48211a1594f1321b00f14c9f7a5b4813144b2fb9
rm -rf ./imaginairy/vendored/blip
mkdir -p ./imaginairy/vendored/blip
cp -R ./downloads/blip/models/* ./imaginairy/vendored/blip/
cp -R ./downloads/blip/configs ./imaginairy/vendored/blip/
sed -i '' -e 's#from models\.#from imaginairy.vendored.blip.#g' ./imaginairy/vendored/blip/blip.py
sed -i '' -e 's#print(#\# print(#g' ./imaginairy/vendored/blip/blip.py
2022-09-18 00:02:45 +00:00
vendorize_kdiffusion :
2022-10-15 00:21:38 +00:00
rm -rf ./imaginairy/vendored/k_diffusion
rm -rf ./downloads/k_diffusion
# version 0.0.9
2022-11-26 23:37:45 +00:00
make vendorize REPO = git@github.com:crowsonkb/k-diffusion.git PKG = k_diffusion COMMIT = 5b3af030dd83e0297272d861c19477735d0317ec
2022-09-18 00:02:45 +00:00
#sed -i '' -e 's/import\sclip/from\simaginairy.vendored\simport\sclip/g' imaginairy/vendored/k_diffusion/evaluation.py
2022-10-15 00:21:38 +00:00
mv ./downloads/k_diffusion/LICENSE ./imaginairy/vendored/k_diffusion/
2022-09-14 07:40:25 +00:00
rm imaginairy/vendored/k_diffusion/evaluation.py
touch imaginairy/vendored/k_diffusion/evaluation.py
rm imaginairy/vendored/k_diffusion/config.py
touch imaginairy/vendored/k_diffusion/config.py
# without this most of the k-diffusion samplers didn't work
2022-09-14 16:37:45 +00:00
sed -i '' -e 's#return (x - denoised) / utils.append_dims(sigma, x.ndim)#return (x - denoised) / sigma#g' imaginairy/vendored/k_diffusion/sampling.py
2022-12-21 17:25:25 +00:00
sed -i '' -e 's#torch.randn_like(x)#torch.randn_like(x, device="cpu").to(x.device)#g' imaginairy/vendored/k_diffusion/sampling.py
2022-11-13 03:24:03 +00:00
# https://github.com/AUTOMATIC1111/stable-diffusion-webui/issues/4558#issuecomment-1310387114
2022-11-13 04:13:33 +00:00
sed -i '' -e 's#t_fn = lambda sigma: sigma.log().neg()#t_fn = lambda sigma: sigma.to("cpu").log().neg().to(x.device)#g' imaginairy/vendored/k_diffusion/sampling.py
2022-11-26 23:37:45 +00:00
sed -i '' -e 's#return (x - denoised) / sigma#return ((x - denoised) / sigma.to("cpu")).to(x.device)#g' imaginairy/vendored/k_diffusion/sampling.py
2022-11-13 04:13:33 +00:00
sed -i '' -e 's#return t.neg().exp()#return t.to("cpu").neg().exp().to(self.model.device)#g' imaginairy/vendored/k_diffusion/sampling.py
2022-11-26 23:37:45 +00:00
sed -i '' -e 's#import torchsde##g' imaginairy/vendored/k_diffusion/sampling.py
2023-01-02 09:24:48 +00:00
sed -i '' -e 's#torch.randint(0, 2\*\*63 - 1, \[\])#torch.randint(0, 2**63 - 1, [], device="cpu")#g' imaginairy/vendored/k_diffusion/sampling.py
sed -i '' -e 's#torch.randint_like(x, 2)#torch.randint_like(x, 2, device="cpu")#g' imaginairy/vendored/k_diffusion/sampling.py
2022-09-14 07:40:25 +00:00
make af
2022-09-13 16:12:47 +00:00
feature: prompt expansion (#51)
You can use `{}` to randomly pull values from lists. A list of values separated by `|` and enclosed in `{ }` will be randomly drawn from in a non-repeating fashion. Values that are surrounded by `_ _` will pull from a phrase list of the same name. Folders containing .txt phraselist files may be specified via
`--prompt_library_path`. The option may be specified multiple times. Built-in categories:
3d-term, adj-architecture, adj-beauty, adj-detailed, adj-emotion, adj-general, adj-horror, animal, art-movement,
art-site, artist, artist-botanical, artist-surreal, aspect-ratio, bird, body-of-water, body-pose, camera-brand,
camera-model, color, cosmic-galaxy, cosmic-nebula, cosmic-star, cosmic-term, dinosaur, eyecolor, f-stop,
fantasy-creature, fantasy-setting, fish, flower, focal-length, food, fruit, games, gen-modifier, hair, hd,
iso-stop, landscape-type, national-park, nationality, neg-weight, noun-beauty, noun-fantasy, noun-general,
noun-horror, occupation, photo-term, pop-culture, pop-location, punk-style, quantity, rpg-item, scenario-desc,
skin-color, spaceship, style, tree-species, trippy, world-heritage-site
Examples:
`imagine "a {red|black} dog" -r 2 --seed 0` will generate both "a red dog" and "a black dog"
`imagine "a {_color_} dog" -r 4 --seed 0` will generate four, different colored dogs. The colors will eb pulled from an included
phraselist of colors.
`imagine "a {_spaceship_|_fruit_|hot air balloon}. low-poly" -r 4 --seed 0` will generate images of spaceships or fruits or a hot air balloon
Credit to [noodle-soup-prompts](https://github.com/WASasquatch/noodle-soup-prompts/) where most, but not all, of the wordlists originate.
2022-10-09 01:34:35 +00:00
vendorize_noodle_soup :
make download_repo REPO = git@github.com:WASasquatch/noodle-soup-prompts.git PKG = noodle-soup-prompts COMMIT = 5642feb4d0e1340b9d145f5ff64f2b57eab1ae71
mkdir -p ./imaginairy/vendored/noodle_soup_prompts
rm ./imaginairy/vendored/noodle_soup_prompts/*
mv ./downloads/noodle-soup-prompts/LICENSE ./imaginairy/vendored/noodle_soup_prompts/
python scripts/prep_vocab_lists.py
make af
2023-05-01 04:57:39 +00:00
vendorize_controlnet_annotators :
make download_repo REPO = git@github.com:lllyasviel/ControlNet-v1-1-nightly.git PKG = controlnet11 COMMIT = b9ae087ef56ca786d9a3ee1008f814bb171bb913
mkdir -p ./imaginairy/vendored/controlnet_annotators
rm -rf ./imaginairy/vendored/controlnet_annotators/*
cp -R ./downloads/controlnet11/annotator/* ./imaginairy/vendored/controlnet_annotators/
rm -rf ./imaginairy/vendored/controlnet_annotators/canny
rm -rf ./imaginairy/vendored/controlnet_annotators/ckpts
#black imaginairy/vendored/controlnet_annotators
sed -i '' -e 's#from annotator.uniformer.mmseg#from .mmseg#g' imaginairy/vendored/controlnet_annotators/uniformer/__init__.py
find imaginairy/vendored/controlnet_annotators -type f -name "__init__.py" -exec sed -i '' -e 's#checkpoint_file#remote_model_path#g' { } \;
find imaginairy/vendored/controlnet_annotators -type f -name "__init__.py" -exec sed -i '' -e 's#modelpath#model_path#g' { } \;
find imaginairy/vendored/controlnet_annotators -type f -name "__init__.py" -exec sed -i '' -e '/^ *model_path = os.path.join(annotator_ckpts_path, [^)]*/,/^ *load_file_from_url(remote_model_path, model_dir=annotator_ckpts_path)/c\' $$ '\n' ' model_path = get_cached_url_path(remote_model_path)' { } \;
find imaginairy/vendored/controlnet_annotators -type f -name "__init__.py" -exec sed -i '' -e 's|^ *from annotator.util import annotator_ckpts_path|from imaginairy.model_manager import get_cached_url_path|' { } \;
find imaginairy/vendored/controlnet_annotators -type f -name "__init__.py" -exec sed -i '' -e 's|^ *from annotator.util import|from imaginairy.vendored.controlnet_annotators.util import|' { } \;
find imaginairy/vendored/controlnet_annotators -type f -name "*.py" -exec sed -i '' -e 's|^ *from annotator.|from imaginairy.vendored.controlnet_annotators.|' { } \;
touch imaginairy/vendored/controlnet_annotators/__init__.py
sed -i '' -e 's#from annotator.uniformer.mmseg#from .mmseg#g' imaginairy/vendored/controlnet_annotators/uniformer/__init__.py
sed -i '' '11i\' $$ '\n' 'annotator_ckpts_path = os.path.dirname(os.path.dirname(__file__))' imaginairy/vendored/controlnet_annotators/uniformer/__init__.py
rm ./imaginairy/vendored/controlnet_annotators/oneformer/oneformer/data/bpe_simple_voc*
rm -rf ./imaginairy/vendored/controlnet_annotators/zoe/zoedepth/models/base_models/midas_repo/mobile
make af
2023-05-06 19:24:31 +00:00
vendorize_normal_map :
make download_repo REPO = git@github.com:brycedrennan/imaginairy-normal-map.git PKG = imaginairy_normal_map COMMIT = 6b3b1692cbdc21d55c84a01e0b7875df030b6d79
mkdir -p ./imaginairy/vendored/imaginairy_normal_map
rm -rf ./imaginairy/vendored/imaginairy_normal_map/*
cp -R ./downloads/imaginairy_normal_map/imaginairy_normal_map/* ./imaginairy/vendored/imaginairy_normal_map/
make af
2023-05-01 04:57:39 +00:00
2024-01-03 05:06:39 +00:00
vendorize_refiners :
2024-01-20 16:36:53 +00:00
export REPO = git@github.com:finegrain-ai/refiners.git PKG = refiners COMMIT = 91aea9b7ff63ddf93f99e2ce6a4452bd658b1948 && \
2024-01-03 05:06:39 +00:00
make download_repo REPO = $$ REPO PKG = $$ PKG COMMIT = $$ COMMIT && \
mkdir -p ./imaginairy/vendored/$$ PKG && \
rm -rf ./imaginairy/vendored/$$ PKG/* && \
cp -R ./downloads/refiners/src/refiners/* ./imaginairy/vendored/$$ PKG/ && \
cp ./downloads/refiners/LICENSE ./imaginairy/vendored/$$ PKG/ && \
rm -rf ./imaginairy/vendored/$$ PKG/training_utils && \
echo " vendored from $$ REPO @ $$ COMMIT " | tee ./imaginairy/vendored/$$ PKG/readme.txt
find ./imaginairy/vendored/refiners/ -type f -name "*.py" -exec sed -i '' 's/from refiners/from imaginairy.vendored.refiners/g' { } + && \
find ./imaginairy/vendored/refiners/ -type f -name "*.py" -exec sed -i '' 's/import refiners/import imaginairy.vendored.refiners/g' { } + && \
make af
2024-01-07 00:07:56 +00:00
vendorize_facexlib :
export REPO = git@github.com:xinntao/facexlib.git PKG = facexlib COMMIT = 260620ae93990a300f4b16448df9bb459f1caba9 && \
make download_repo REPO = $$ REPO PKG = $$ PKG COMMIT = $$ COMMIT && \
mkdir -p ./imaginairy/vendored/$$ PKG && \
rm -rf ./imaginairy/vendored/$$ PKG/* && \
cp -R ./downloads/$$ PKG/facexlib/* ./imaginairy/vendored/$$ PKG/ && \
rm -rf ./imaginairy/vendored/$$ PKG/weights && \
cp ./downloads/$$ PKG/LICENSE ./imaginairy/vendored/$$ PKG/ && \
echo " vendored from $$ REPO @ $$ COMMIT " | tee ./imaginairy/vendored/$$ PKG/readme.txt
find ./imaginairy/vendored/facexlib/ -type f -name "*.py" -exec sed -i '' 's/from facexlib/from imaginairy.vendored.facexlib/g' { } + && \
sed -i '' '/from \.version import __gitsha__, __version__/d' ./imaginairy/vendored/facexlib/__init__.py
make af
feature: prompt expansion (#51)
You can use `{}` to randomly pull values from lists. A list of values separated by `|` and enclosed in `{ }` will be randomly drawn from in a non-repeating fashion. Values that are surrounded by `_ _` will pull from a phrase list of the same name. Folders containing .txt phraselist files may be specified via
`--prompt_library_path`. The option may be specified multiple times. Built-in categories:
3d-term, adj-architecture, adj-beauty, adj-detailed, adj-emotion, adj-general, adj-horror, animal, art-movement,
art-site, artist, artist-botanical, artist-surreal, aspect-ratio, bird, body-of-water, body-pose, camera-brand,
camera-model, color, cosmic-galaxy, cosmic-nebula, cosmic-star, cosmic-term, dinosaur, eyecolor, f-stop,
fantasy-creature, fantasy-setting, fish, flower, focal-length, food, fruit, games, gen-modifier, hair, hd,
iso-stop, landscape-type, national-park, nationality, neg-weight, noun-beauty, noun-fantasy, noun-general,
noun-horror, occupation, photo-term, pop-culture, pop-location, punk-style, quantity, rpg-item, scenario-desc,
skin-color, spaceship, style, tree-species, trippy, world-heritage-site
Examples:
`imagine "a {red|black} dog" -r 2 --seed 0` will generate both "a red dog" and "a black dog"
`imagine "a {_color_} dog" -r 4 --seed 0` will generate four, different colored dogs. The colors will eb pulled from an included
phraselist of colors.
`imagine "a {_spaceship_|_fruit_|hot air balloon}. low-poly" -r 4 --seed 0` will generate images of spaceships or fruits or a hot air balloon
Credit to [noodle-soup-prompts](https://github.com/WASasquatch/noodle-soup-prompts/) where most, but not all, of the wordlists originate.
2022-10-09 01:34:35 +00:00
2022-09-13 07:27:53 +00:00
vendorize : ## vendorize a github repo. `make vendorize REPO=git@github.com:openai/CLIP.git PKG=clip`
mkdir -p ./downloads
-cd ./downloads && git clone $( REPO) $( PKG)
2022-09-14 07:40:25 +00:00
cd ./downloads/$( PKG) && git fetch && git checkout $( COMMIT)
2022-09-13 07:27:53 +00:00
rm -rf ./imaginairy/vendored/$( PKG)
cp -R ./downloads/$( PKG) /$( PKG) imaginairy/vendored/
2022-10-15 00:21:38 +00:00
git --git-dir ./downloads/$( PKG) /.git rev-parse HEAD | tee ./imaginairy/vendored/$( PKG) /source-commit-hash.txt
2022-09-13 07:27:53 +00:00
touch ./imaginairy/vendored/$( PKG) /version.py
echo " vendored from $( REPO) " | tee ./imaginairy/vendored/$( PKG) /readme.txt
2022-09-18 00:02:45 +00:00
download_repo :
mkdir -p ./downloads
2022-09-28 06:15:34 +00:00
rm -rf ./downloads/$( PKG)
2022-09-18 00:02:45 +00:00
-cd ./downloads && git clone $( REPO) $( PKG)
cd ./downloads/$( PKG) && git pull
2022-09-13 07:27:53 +00:00
vendorize_whole_repo :
mkdir -p ./downloads
-cd ./downloads && git clone $( REPO) $( PKG)
cd ./downloads/$( PKG) && git pull
rm -rf ./imaginairy/vendored/$( PKG)
cp -R ./downloads/$( PKG) imaginairy/vendored/
git --git-dir ./downloads/$( PKG) /.git rev-parse HEAD | tee ./imaginairy/vendored/$( PKG) /clip-commit-hash.txt
touch ./imaginairy/vendored/$( PKG) /version.py
echo " vendored from $( REPO) " | tee ./imaginairy/vendored/$( PKG) /readme.txt
2022-09-12 05:22:43 +00:00
2022-09-11 20:57:15 +00:00
help : ## Show this help message.
@## https://gist.github.com/prwhite/8168133#gistcomment-1716694
@echo -e " $$ (grep -hE '^\S+:.*##' $( MAKEFILE_LIST) | sed -e 's/:.*##\s*/:/' -e 's/^\(.\+\):\(.*\)/\\x1b[36m\1\\x1b[m:\2/' | column -c2 -t -s :) " | sort