| # A mirror of anything interesting on civitai or elsewhere on the web. | |
| This repo is *mostly* organized around the structure | |
| that's necessary to import the entire repo into an | |
| automatic1111 install. This is because models were originally | |
| uploaded directly from such an install via google drive in | |
| a colab session. | |
| Currently I'm uploading files via my new space over at | |
| https://hf.co/anonderpling/repo_uploader, however I expect | |
| to go back to a real file system and git uploads soon, | |
| hopefully paperspace can help with that. | |
| ## Workflow | |
| My workflow for downloading files into paperspace gradient | |
| is to download the entire repo *without* pulling LFS | |
| files, do a sparse checkout, and then pull the files I | |
| want with LFS --include (slow) or aria2 (fast). This | |
| workflow should work with colab, too. Whether you use | |
| colab or paperspace, you'll probably need the latest | |
| version of git to use `sparse-checkout --add`. | |
| ## How to upload and download files | |
| ```bash | |
| !GIT_LFS_SPARSE_CHECKOUT=1 git clone [email protected]:anonderpling/civitai_mirror # this is my command so I can push changes, you'll need to use the https://hf.co/ instead of [email protected]: | |
| !cd civitai_mirror | |
| !git sparse-checkout set embeddings # embeddings are small, so it's easy enough to just pull all of them | |
| !git sparse-checkout add models/VAE # there's only a few VAEs, and they're generally needed, so grab all those too... | |
| !git sparse-checkout add models/Stable-diffusion/illuminati* models/Stable-diffusion/revAnimated* # add some stable diffusion models I intend to work with in this session | |
| !apt install aria2 # make sure aria2c is installed | |
| # let's break the following command down into parts, since there's multiple commands on one line | |
| # find models embeddings --type f --size -2 # find files in models and embeddings directories smaller than 2 kilobytes (these are the lfs pointers that were checked out) | |
| # | while read a; do #lets build an aria2c input file | |
| # echo "https://huggingface.co/anonderpling/civitai_mirror/resolve/main/${a}"; # tell aria2c where to find the file | |
| # echo " out=${a}"; # tell aria2c where to place said file | |
| # rm "${a}"; remove the existing file, because I'm too lazy to look up the option to have aria2c overwrite it (plus if you stop in the middle, you can tell at a glance what else is needed) | |
| # done | tee aria2.in.txt # end the loop, but watch to make sure theres nothing accidentally included by wildcards that shouldnt have been...downloads could take a while (and fill the disk) if I accidentally put a space before the * | |
| # aria2 -x16 --split=16 -i aria2.in.txt # download all the files as fast as possible | |
| !find models embeddings --type f --size -2 | while read a; do echo "https://huggingface.co/anonderpling/civitai_mirror/resolve/main/${a}"; echo " out=${a}"; rm "${a}"; done | tee aria2.in.txt | |
| !aria2 -x16 --split=16 -i aria2.in.txt | |
| ``` | |
| to upload more files via git: | |
| ```bash | |
| # enable the git lfs filters | |
| !pip install huggingface_hub | |
| !huggingface-cli lfs_enable_largefiles . | |
| # yup, not telling. I'm an *anonymous* derpling, after all | |
| !git config --local user.name 'not telling' | |
| # really couldnt care less if this is accurate...maybe I'll start randomizing it... | |
| !git config --local user.email '[email protected]' | |
| # create an rsa key with no password | |
| !ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_hf.co -P '' | |
| # a clickable link in jupyter/colab/paperspace | |
| print('https://hf.co/settings/keys') | |
| # give the public key so it can be easily copied to huggingface | |
| !cat ~/.ssh/id_hf.co.pub | |
| # track files 1mb+ with lfs manually (huggingface filter deals with models automatically, but large previews will give you errors) | |
| !find -type f -size +999k -not \( -name '*.safetensors' -o -name '*.ckpt' -o -name '*.pt' \) -exec git lfs track '{}' + | |
| # IMPORTANT: make sure you add the git ssh key above before uploading | |
| !sleep 1m # gives you time to do so | |
| # upload your files now. do make sure you dont upload files that didnt download properly (interrupted aria2c, lfs pointers, etc) | |
| !git add .gitattributes models embeddings | |
| !git commit -m "add a message..." | |
| !git push | |
| ``` | |
| to upload a single file via huggingface_hub: | |
| ```python | |
| inurl=api.upload_folder( # https://huggingface.co/docs/huggingface_hub/v0.14.1/en/package_reference/hf_api#huggingface_hub.HfApi.upload_folder | |
| token="hf_token", # only needed if you didn't already use huggingface_hub.login() previously. | |
| path_or_fileobj="/content/stable-diffusion-webui/models/Stable-diffusion/Rev-Animated.safetensors", # location of the file you want to upload | |
| path_in_repo="models/Stable-diffusion/Rev-Animated.safetensors", | |
| repo_id="mirroring/civitai_mirror", | |
| commit_message="Uploading Rev Animated", # optional. | |
| commit_description="I want to upload Rev Animated because it's a special file for me.\nPlease accept my PR. I don't want to host it on my own HF repo!" # optional. Required (here) for PRs. | |
| create_pr=True # optional. needed if you're not a special person allowed to add new files to the repo (ie, if you just want us to mirror something; make sure to fill out the description/message above, as well) | |
| ) | |
| print("Uploaded files. Check them out at "+inurl) | |
| ``` | |
| to upload multiple files via huggingface_hub: | |
| ```python | |
| inurl=api.upload_folder( # https://huggingface.co/docs/huggingface_hub/v0.14.1/en/package_reference/hf_api#huggingface_hub.HfApi.upload_folder | |
| token="hf_token", # only needed if you didn't already use huggingface_hub.login() previously. | |
| folder_path="/stable-diffusion-webui/models/", | |
| path_in_repo="models", | |
| repo_id="mirroring/civitai_mirror", | |
| allow_patterns="*.safetensors", # optional. Only upload certain files. | |
| ignore_patterns=["*.tmp","tmp/*","*.jpg"], # optional. Ignore certain files. | |
| commit_message="Uploading my own models", | |
| commit_description="I want to upload these models because..." | |
| create_pr=True # needed if you're not a special person allowed to add new files to the repo (ie, if you just want us to mirror something) | |
| ) | |
| print("Uploaded files. Check them out at "+inurl) | |
| ``` | |
| #### It's extremely important to remove the ssh key from your HF repo after you're done with it. this ensures that nobody else can access your account. | |
| Paperspace makes free notebooks public, and I'm not sure | |
| if that includes filesystem access or outputs; if someone | |
| can access that ssh key and you didnt remove the access it | |
| generates, you've given them thr ability to make changes | |
| to your repo! This means they could delete *everything*. | |
| If you're technically inclined, you can possibly use the | |
| paperspace secrets configuration to hide such information | |
| (I'm not sure how it works yet) | |
| Alternatively, you can add big files via | |
| https://hf.co/anonderpling/repo_uploader before your | |
| session (the renamed file part is pretty much added for | |
| uploading from HF urls, but also works for adding preview | |
| images), and manually upload the civitai.info files | |
| locally (these are just simple civitai api responses | |
| afaik) | |
| ## TODO: | |
| 1. finish moving files around (figure out a way to do so without 2 commits per file (one to copy, one to delete file) without downloading every single file | |
| 2. move sfw models into a subdirectory | |
| 3. consider moving locons to their own directory in models, now that I'm using paperspace... | |
| - Perpetual: keep an eye on civitai update notifications | |
| ## License | |
| I like WTFPL. That means anything generated by @anonderpling is licensed WTFPL. That means pretty much only this readme, since everything else is someone else's work. | |
| Other files? You'll have to find their official sources to find their licenses. The licenses for the civitai uploads *might* be in the .civitai.info files, which are standard json (AFAIK) as returned by the civitai API. |