From 3d42740b3b8cb0d4065ef8626fa50d1c16fe8067 Mon Sep 17 00:00:00 2001 From: KeesGeerligs <166137421+KeesGeerligs@users.noreply.github.com> Date: Thu, 14 Nov 2024 10:39:24 +0100 Subject: [PATCH 1/5] more templates --- .../info.json | 8 +- templates/Axolotl/README.md | 2 +- templates/Axolotl/axolotl-nobackground.png | Bin 0 -> 20150 bytes templates/Axolotl/info.json | 6 +- .../ComfyUI-stable-diffusion-1.5/README.md | 9 + .../ComfyUI-stable-diffusion-1.5/info.json | 7 + .../job-definition.json | 23 + .../Forge-stable-diffusion-1.5/README.md | 5 + .../Forge-stable-diffusion-1.5/info.json | 7 + .../job-definition.json | 30 + templates/InvokeAI/info.json | 4 +- templates/Kohya-SS/README.md | 9 + templates/Kohya-SS/info.json | 7 + templates/Kohya-SS/job-definition.json | 23 + templates/Nosana-RAG-bot-webui/info.json | 2 +- templates/Oobabooga/README.md | 2 +- templates/Oobabooga/info.json | 6 +- templates/Oobabooga/oobabooga.png | Bin 0 -> 149032 bytes templates/Pytorch-jupyter-notebook/info.json | 4 +- .../job-definition.json | 19 +- templates/Rstudio/info.json | 2 +- .../Tensorflow-jupyter-notebook/info.json | 4 +- templates/Whisper-ASR-API/info.json | 4 +- templates/open-webui-ollama/info.json | 6 +- .../repo-to-text_2024-11-13-15-00-53-UTC.txt | 797 ++++++++++++++++++ 25 files changed, 956 insertions(+), 30 deletions(-) create mode 100644 templates/Axolotl/axolotl-nobackground.png create mode 100644 templates/ComfyUI-stable-diffusion-1.5/README.md create mode 100644 templates/ComfyUI-stable-diffusion-1.5/info.json create mode 100644 templates/ComfyUI-stable-diffusion-1.5/job-definition.json create mode 100644 templates/Forge-stable-diffusion-1.5/README.md create mode 100644 templates/Forge-stable-diffusion-1.5/info.json create mode 100644 templates/Forge-stable-diffusion-1.5/job-definition.json create mode 100644 templates/Kohya-SS/README.md create mode 100644 templates/Kohya-SS/info.json create mode 100644 templates/Kohya-SS/job-definition.json create mode 100644 templates/Oobabooga/oobabooga.png create mode 100644 templates/repo-to-text_2024-11-13-15-00-53-UTC.txt diff --git a/templates/AUTOMATIC1111-stable-diffusion-1.5/info.json b/templates/AUTOMATIC1111-stable-diffusion-1.5/info.json index 7c77012..ab072d3 100644 --- a/templates/AUTOMATIC1111-stable-diffusion-1.5/info.json +++ b/templates/AUTOMATIC1111-stable-diffusion-1.5/info.json @@ -1,7 +1,7 @@ { - "id": "stable-diffusion", - "name": "Stable Diffusion", + "id": "AUTOMTIC1111-stable-diffusion", + "name": "AUTOMTIC1111 Stable Diffusion 1.5", "description": "Stable Diffusion is a latent text-to-image diffusion model", - "category": ["AI", "Image Generation", "GPU", "Service", "Featured"], - "icon": "https://res.cloudinary.com/dsht8f3ff/image/upload/v1714833633/stabilityai_fiujad.png" + "category": ["Image Generation"], + "icon": "https://private-user-images.githubusercontent.com/173618923/361423663-9ebdd0cf-02e2-497d-b87b-f98555396d23.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzE1MTEwOTUsIm5iZiI6MTczMTUxMDc5NSwicGF0aCI6Ii8xNzM2MTg5MjMvMzYxNDIzNjYzLTllYmRkMGNmLTAyZTItNDk3ZC1iODdiLWY5ODU1NTM5NmQyMy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQxMTEzJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MTExM1QxNTEzMTVaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1kNDI5MzVkM2I4NGY1NDViNzEzZDE5ZjYxNzJmYjdmOTM0MWU0OGI4OTg4OTgyZGY3NTUyZGQwODIwNzQzOGU2JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.o4AIHOfkVEEw-Su4HTmAQIzBvnxjcOB1BUiUDzUSZrs" } \ No newline at end of file diff --git a/templates/Axolotl/README.md b/templates/Axolotl/README.md index 717260f..b315bb8 100644 --- a/templates/Axolotl/README.md +++ b/templates/Axolotl/README.md @@ -1,6 +1,6 @@ # Axolotl -![Axolotl](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/axolotl/axolotl.mp4) +![Axolotl](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Axolotl/axolotl.mp4) Axolotl is a powerful tool designed to streamline the fine-tuning of various AI models, offering support for multiple configurations and architectures. It enables efficient training with single or multiple GPUs, making it ideal for both personal and professional projects. diff --git a/templates/Axolotl/axolotl-nobackground.png b/templates/Axolotl/axolotl-nobackground.png new file mode 100644 index 0000000000000000000000000000000000000000..46be0c3899dd5c26b5cd39e86baec81d99cd7ce5 GIT binary patch literal 20150 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 literal 0 HcmV?d00001 diff --git a/templates/Axolotl/info.json b/templates/Axolotl/info.json index 4052c71..beb6dbe 100644 --- a/templates/Axolotl/info.json +++ b/templates/Axolotl/info.json @@ -1,7 +1,7 @@ { "id": "axolotl", - "name": "Axolotl", + "name": "Axolotl finetuning LLM's", "description": "Axolotl streamlines the fine-tuning of various AI models, supporting multiple configurations and architectures for efficient and flexible model training.", - "category": ["AI", "Model Fine-Tuning", "GPU", "Service", "Featured"], - "icon": "https://avatars.githubusercontent.com/u/132000632?s=280&v=4" + "category": ["Model Fine-Tuning"], + "icon": "https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Axolotl/axolotl-nobackground.png" } diff --git a/templates/ComfyUI-stable-diffusion-1.5/README.md b/templates/ComfyUI-stable-diffusion-1.5/README.md new file mode 100644 index 0000000..75000c5 --- /dev/null +++ b/templates/ComfyUI-stable-diffusion-1.5/README.md @@ -0,0 +1,9 @@ +# Oobabooga Text Generation WebUI + +![Oobabooga](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Oobabooga/oobabooga.mp4) + +Oobabooga Text Generation WebUI is a powerful and flexible interface for generating text using various AI models. It supports multiple backends, including Transformers, llama.cpp, and ExLlamaV2, providing a seamless experience for both professionals and enthusiasts. + +Unleash your creativity with Nosana! Effortlessly run an Oobabooga instance to generate sophisticated text content. Experience the power of advanced AI and GPU-backed nodes, ensuring efficient and high-quality text generation for your projects. + +Whether for personal use, research, or professional applications, Nosana provides the tools you need to harness the full potential of Oobabooga's capabilities. diff --git a/templates/ComfyUI-stable-diffusion-1.5/info.json b/templates/ComfyUI-stable-diffusion-1.5/info.json new file mode 100644 index 0000000..1b90132 --- /dev/null +++ b/templates/ComfyUI-stable-diffusion-1.5/info.json @@ -0,0 +1,7 @@ +{ + "id": "comfyui-stable-diffusion", + "name": "ComfyUI Stable Diffusion 1.5", + "description": "A powerful and modular Stable Diffusion GUI with a node-based interface.", + "category": ["Image Generation"], + "icon": "https://private-user-images.githubusercontent.com/75789136/253827723-a9445b86-a979-4467-be0b-750800e655a0.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzE1MTA1NTksIm5iZiI6MTczMTUxMDI1OSwicGF0aCI6Ii83NTc4OTEzNi8yNTM4Mjc3MjMtYTk0NDViODYtYTk3OS00NDY3LWJlMGItNzUwODAwZTY1NWEwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDExMTMlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQxMTEzVDE1MDQxOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTg4NDQ2MTU1ODU1NTMzMjg0MThhOTc4YTYwNTdjYWRiNDcwZjVkMTcxYWNjNjk3ODQ5NzUzOGUyYjVkMjA4ZWMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.VCLpIwvsIHD_gDZwATVKIyYHp0sfY6yIrpDLXfOdLDk" +} diff --git a/templates/ComfyUI-stable-diffusion-1.5/job-definition.json b/templates/ComfyUI-stable-diffusion-1.5/job-definition.json new file mode 100644 index 0000000..888630d --- /dev/null +++ b/templates/ComfyUI-stable-diffusion-1.5/job-definition.json @@ -0,0 +1,23 @@ +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "openai-whisper-asr-webservice", + "args": { + "image": "docker.io/onerahmet/openai-whisper-asr-webservice:latest-gpu", + "cmd": [], + "gpu": true, + "expose": 9000, + "env": { + "ASR_MODEL": "base", + "ASR_ENGINE": "openai_whisper" + } + } + } + ] +} diff --git a/templates/Forge-stable-diffusion-1.5/README.md b/templates/Forge-stable-diffusion-1.5/README.md new file mode 100644 index 0000000..fe1288b --- /dev/null +++ b/templates/Forge-stable-diffusion-1.5/README.md @@ -0,0 +1,5 @@ +# Forge Stable Diffusion + +![Forge Stable Diffusion](https://raw.githubusercontent.com/nosana-ci/templates/main/templates/Forge-Stable-Diffusion/forge.gif) + +Forge Stable Diffusion is an optimized web UI for Stable Diffusion, offering enhanced performance and additional features for a superior image generation experience. diff --git a/templates/Forge-stable-diffusion-1.5/info.json b/templates/Forge-stable-diffusion-1.5/info.json new file mode 100644 index 0000000..07f41ef --- /dev/null +++ b/templates/Forge-stable-diffusion-1.5/info.json @@ -0,0 +1,7 @@ +{ + "id": "forge-stable-diffusion", + "name": "Forge Stable Diffusion 1.5", + "description": "An optimized Stable Diffusion web UI with enhanced performance and features.", + "category": ["Image Generation"], + "icon": "https://private-user-images.githubusercontent.com/173618923/361423583-2dd6f478-e67a-4cc3-9b69-8a1c7728e06a.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzE1MTEwOTUsIm5iZiI6MTczMTUxMDc5NSwicGF0aCI6Ii8xNzM2MTg5MjMvMzYxNDIzNTgzLTJkZDZmNDc4LWU2N2EtNGNjMy05YjY5LThhMWM3NzI4ZTA2YS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQxMTEzJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MTExM1QxNTEzMTVaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1jY2JlNjg1MDUxM2I4YTZlYzg5MGQyMWE1Y2ViZjI1YTM1ZGViMTgwZDE4ZWY4ZWNmMjQyZDZlNDIyZGQ4NjFlJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.Ao9S1dPfnQPmzdlBJJjDJ1d0zN8mw8n1_Fp7d0F81pY" +} diff --git a/templates/Forge-stable-diffusion-1.5/job-definition.json b/templates/Forge-stable-diffusion-1.5/job-definition.json new file mode 100644 index 0000000..4e8f0ff --- /dev/null +++ b/templates/Forge-stable-diffusion-1.5/job-definition.json @@ -0,0 +1,30 @@ +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "forge_stablediffusion", + "args": { + "cmd": [ + "/bin/sh", "-c", + "python -u launch.py --api --listen --pytorch-deterministic --port 7861 --disable-xformers" + ], + "image": "docker.io/nosana/sd-forge-bench:1.0.0", + "gpu": true, + "expose": 7861, + "resources": [ + { + "type": "S3", + "url": "https://models.nosana.io/stable-diffusion/1.5", + "target": "/opt/stable-diffusion-webui-forge/models/Stable-diffusion" + } + ] + + } + } + ] +} \ No newline at end of file diff --git a/templates/InvokeAI/info.json b/templates/InvokeAI/info.json index c06ee80..2be4474 100644 --- a/templates/InvokeAI/info.json +++ b/templates/InvokeAI/info.json @@ -2,6 +2,6 @@ "id": "invoke-ai", "name": "Invoke AI", "description": "Invoke is a leading creative engine built to empower professionals and enthusiasts alike. Generate and create stunning visual media using the latest AI-driven technologies.", - "category": ["AI", "Image Generation", "GPU", "Service", "Featured"], - "icon": "https://cdn.prod.website-files.com/6569f44a2a0eba8a49bc11a1/65772970ccfba3673b7db46a_logo-invoke.svg" + "category": ["Image Generation"], + "icon": "https://d4.alternativeto.net/xsSoWnh09YOroqDfDTYx-QcFdoXjOMcxLtDc7FZleA0/rs:fit:280:280:0/g:ce:0:0/exar:1/YWJzOi8vZGlzdC9pY29ucy9pbnZva2VhaV8yMjc0ODEucG5n.png" } diff --git a/templates/Kohya-SS/README.md b/templates/Kohya-SS/README.md new file mode 100644 index 0000000..75000c5 --- /dev/null +++ b/templates/Kohya-SS/README.md @@ -0,0 +1,9 @@ +# Oobabooga Text Generation WebUI + +![Oobabooga](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Oobabooga/oobabooga.mp4) + +Oobabooga Text Generation WebUI is a powerful and flexible interface for generating text using various AI models. It supports multiple backends, including Transformers, llama.cpp, and ExLlamaV2, providing a seamless experience for both professionals and enthusiasts. + +Unleash your creativity with Nosana! Effortlessly run an Oobabooga instance to generate sophisticated text content. Experience the power of advanced AI and GPU-backed nodes, ensuring efficient and high-quality text generation for your projects. + +Whether for personal use, research, or professional applications, Nosana provides the tools you need to harness the full potential of Oobabooga's capabilities. diff --git a/templates/Kohya-SS/info.json b/templates/Kohya-SS/info.json new file mode 100644 index 0000000..e11df3b --- /dev/null +++ b/templates/Kohya-SS/info.json @@ -0,0 +1,7 @@ +{ + "id": "whisper-asr-webservice", + "name": "Whisper ASR Webservice", + "description": "A robust speech recognition service powered by OpenAI's Whisper model, supporting multilingual transcription, translation, and language identification.", + "category": ["Featured"], + "icon": "https://www.datocms-assets.com/96965/1685731715-open-ai-stars-2x.png" +} diff --git a/templates/Kohya-SS/job-definition.json b/templates/Kohya-SS/job-definition.json new file mode 100644 index 0000000..888630d --- /dev/null +++ b/templates/Kohya-SS/job-definition.json @@ -0,0 +1,23 @@ +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "openai-whisper-asr-webservice", + "args": { + "image": "docker.io/onerahmet/openai-whisper-asr-webservice:latest-gpu", + "cmd": [], + "gpu": true, + "expose": 9000, + "env": { + "ASR_MODEL": "base", + "ASR_ENGINE": "openai_whisper" + } + } + } + ] +} diff --git a/templates/Nosana-RAG-bot-webui/info.json b/templates/Nosana-RAG-bot-webui/info.json index 95dddd9..76a589b 100644 --- a/templates/Nosana-RAG-bot-webui/info.json +++ b/templates/Nosana-RAG-bot-webui/info.json @@ -2,6 +2,6 @@ "id": "nosana-llm-rag-webui", "name": "Nosana LLM RAG WebUI", "description": "A powerful LLM RAG WebUI running on the LMDeploy framework with LLama3.1 70B quantized, optimized for high-end GPUs.", - "category": ["AI", "LLM", "RAG", "GPU", "Service", "Featured"], + "category": ["LLM"], "icon": "https://nosana.io/img/Nosana_Logomark_color.png" } diff --git a/templates/Oobabooga/README.md b/templates/Oobabooga/README.md index 75000c5..2ce8530 100644 --- a/templates/Oobabooga/README.md +++ b/templates/Oobabooga/README.md @@ -1,6 +1,6 @@ # Oobabooga Text Generation WebUI -![Oobabooga](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Oobabooga/oobabooga.mp4) +![Oobabooga](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Oobabooga/oobabooga.gif) Oobabooga Text Generation WebUI is a powerful and flexible interface for generating text using various AI models. It supports multiple backends, including Transformers, llama.cpp, and ExLlamaV2, providing a seamless experience for both professionals and enthusiasts. diff --git a/templates/Oobabooga/info.json b/templates/Oobabooga/info.json index 41b2607..b0bf475 100644 --- a/templates/Oobabooga/info.json +++ b/templates/Oobabooga/info.json @@ -1,7 +1,7 @@ { "id": "oobabooga", - "name": "Oobabooga", + "name": "Oobabooga web UI", "description": "Oobabooga is a versatile text generation web UI supporting multiple backends, offering rich features for generating and managing AI-driven text models.", - "category": ["AI", "Text Generation", "GPU", "Service", "Featured"], - "icon": "https://archive.org/details/github.com-oobabooga-text-generation-webui_-_2023-08-28_21-02-24" + "category": ["LLM"], + "icon": "https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Oobabooga/oobabooga.png" } diff --git a/templates/Oobabooga/oobabooga.png b/templates/Oobabooga/oobabooga.png new file mode 100644 index 0000000000000000000000000000000000000000..5d6db5de71c5b27d54bfc28eb9a47c4439eaa668 GIT binary patch literal 149032 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%0A`iih;>l9p}Z^x5Ipt>nsm+H`$1pjMYCoVFvIFG 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 %wrPxE;5#;z)~zbxRrR9wfhOWNbd~mj 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

hzfS>b6 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 z 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 z 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 in your web browser to access the RStudio interface. + +3. **Configure RStudio:** + - **Username:** `rstudio` + - **Password:** Set via the `PASSWORD` environment variable in the job definition. + +## Configuration + +- **Environment Variables:** + - `USER=rstudio`: Sets the RStudio user. + - `PASSWORD=password`: Password for RStudio login. + - `RUNROOTLESS=false`: Run RStudio as root (set to `false` for security). + +- **Ports:** + - `8787`: Access the RStudio web interface. + +``` + +Contents of Tensorflow-jupyter-notebook\info.json: +``` +{ + "id": "jupyter-notebook-tensorflow", + "name": "Jupyter Notebook with Tensorflow", + "description": "Jupyter Notebook Service", + "category": ["Featured"], + "icon": "https://seeklogo.com/images/J/jupyter-logo-A91705F539-seeklogo.com.png" +} +``` + +Contents of Tensorflow-jupyter-notebook\job-definition.json: +``` +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "job-builder" + }, + "ops": [ + { + "type": "container/run", + "id": "jupyter-notebook", + "args": { + "cmd": "source /etc/bash.bashrc && jupyter notebook --notebook-dir=/tf --ip 0.0.0.0 --no-browser --allow-root --NotebookApp.token='' --NotebookApp.password=''", + "expose": 8888, + "image": "tensorflow/tensorflow:latest-gpu-jupyter", + "gpu": true + } + } + ] +} +``` + +Contents of Tensorflow-jupyter-notebook\jupyter.gif: +``` +[Could not decode file contents] + +``` + +Contents of Tensorflow-jupyter-notebook\README.md: +``` +# Jupyter Notebook Template + +![Jupyter Notebook](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Tensorflow-jupyter-notebook/jupyter.gif) + +Harness the power of Nosana Endpoint to seamlessly run Jupyter Notebooks and connect via a user-friendly web interface. With access to GPU-backed nodes, you can conduct your experiments efficiently and cost-effectively, unlocking new possibilities for your research and data analysis + +``` + +Contents of VScode-server\info.json: +``` +{ + "id": "vscode-server", + "name": "VSCode Server", + "description": "Run Visual Studio Code on a remote server accessible through your browser, enabling a consistent and powerful development environment.", + "category": ["Development", "IDE", "GPU", "Service", "Featured"], + "icon": "https://avatars.githubusercontent.com/u/12324908?s=280&v=4" +} + +``` + +Contents of VScode-server\job-definition.json: +``` +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "code-server", + "args": { + "image": "lscr.io/linuxserver/code-server:latest", + "cmd": [], + "gpu": true, + "expose": 8443, + "env": { + "PUID": "1000", + "PGID": "1000", + "TZ": "Etc/UTC", + "SUDO_PASSWORD": "password" + } + } + } + ] +} + +``` + +Contents of VScode-server\README.md: +``` +# Oobabooga Text Generation WebUI + +![Oobabooga](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Oobabooga/oobabooga.mp4) + +Oobabooga Text Generation WebUI is a powerful and flexible interface for generating text using various AI models. It supports multiple backends, including Transformers, llama.cpp, and ExLlamaV2, providing a seamless experience for both professionals and enthusiasts. + +Unleash your creativity with Nosana! Effortlessly run an Oobabooga instance to generate sophisticated text content. Experience the power of advanced AI and GPU-backed nodes, ensuring efficient and high-quality text generation for your projects. + +Whether for personal use, research, or professional applications, Nosana provides the tools you need to harness the full potential of Oobabooga's capabilities. + +``` + +Contents of Whisper-ASR-API\info.json: +``` +{ + "id": "whisper-asr-webservice", + "name": "Whisper ASR Webservice", + "description": "A robust speech recognition service powered by OpenAI's Whisper model, supporting multilingual transcription, translation, and language identification.", + "category": ["Featured"], + "icon": "https://www.datocms-assets.com/96965/1685731715-open-ai-stars-2x.png" +} + +``` + +Contents of Whisper-ASR-API\job-definition.json: +``` +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "openai-whisper-asr-webservice", + "args": { + "image": "docker.io/onerahmet/openai-whisper-asr-webservice:latest-gpu", + "cmd": [], + "gpu": true, + "expose": 9000, + "env": { + "ASR_MODEL": "base", + "ASR_ENGINE": "openai_whisper" + } + } + } + ] +} + +``` + +Contents of Whisper-ASR-API\README.md: +``` +# Oobabooga Text Generation WebUI + +![Oobabooga](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Oobabooga/oobabooga.mp4) + +Oobabooga Text Generation WebUI is a powerful and flexible interface for generating text using various AI models. It supports multiple backends, including Transformers, llama.cpp, and ExLlamaV2, providing a seamless experience for both professionals and enthusiasts. + +Unleash your creativity with Nosana! Effortlessly run an Oobabooga instance to generate sophisticated text content. Experience the power of advanced AI and GPU-backed nodes, ensuring efficient and high-quality text generation for your projects. + +Whether for personal use, research, or professional applications, Nosana provides the tools you need to harness the full potential of Oobabooga's capabilities. + +``` + From 2cf22575989b752dffef48d63ff207c6593e443c Mon Sep 17 00:00:00 2001 From: KeesGeerligs <166137421+KeesGeerligs@users.noreply.github.com> Date: Mon, 18 Nov 2024 08:04:18 +0100 Subject: [PATCH 2/5] Minor changes to Readme's --- .../job-definition.json | 2 +- .../ComfyUI-stable-diffusion-1.5/README.md | 10 +-- .../job-definition.json | 24 ++++--- .../job-definition.json | 2 +- templates/Kohya-SS/README.md | 10 +-- templates/Kohya-SS/info.json | 10 +-- templates/Kohya-SS/job-definition.json | 12 ++-- templates/VScode-server/README.md | 69 +++++++++++++++++-- templates/Whisper-ASR-API/README.md | 17 +++-- 9 files changed, 110 insertions(+), 46 deletions(-) diff --git a/templates/AUTOMATIC1111-stable-diffusion-1.5/job-definition.json b/templates/AUTOMATIC1111-stable-diffusion-1.5/job-definition.json index 2cb0deb..42aa5b4 100644 --- a/templates/AUTOMATIC1111-stable-diffusion-1.5/job-definition.json +++ b/templates/AUTOMATIC1111-stable-diffusion-1.5/job-definition.json @@ -11,7 +11,7 @@ "args": { "cmd": [ "/bin/sh", "-c", - "python -u launch.py --listen --port 7860 --api" + "python -u launch.py --listen --port 7860 --enable-insecure-extension-access" ], "image": "docker.io/nosana/automatic1111:0.0.1", "gpu": true, diff --git a/templates/ComfyUI-stable-diffusion-1.5/README.md b/templates/ComfyUI-stable-diffusion-1.5/README.md index 75000c5..95b372c 100644 --- a/templates/ComfyUI-stable-diffusion-1.5/README.md +++ b/templates/ComfyUI-stable-diffusion-1.5/README.md @@ -1,9 +1,5 @@ -# Oobabooga Text Generation WebUI +# ComfyUI Stable Diffusion -![Oobabooga](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Oobabooga/oobabooga.mp4) +![ComfyUI](https://raw.githubusercontent.com/nosana-ci/templates/main/templates/ComfyUI/comfyui.gif) -Oobabooga Text Generation WebUI is a powerful and flexible interface for generating text using various AI models. It supports multiple backends, including Transformers, llama.cpp, and ExLlamaV2, providing a seamless experience for both professionals and enthusiasts. - -Unleash your creativity with Nosana! Effortlessly run an Oobabooga instance to generate sophisticated text content. Experience the power of advanced AI and GPU-backed nodes, ensuring efficient and high-quality text generation for your projects. - -Whether for personal use, research, or professional applications, Nosana provides the tools you need to harness the full potential of Oobabooga's capabilities. +ComfyUI is a powerful and modular Stable Diffusion GUI with a node-based interface, providing advanced control and flexibility for image generation. diff --git a/templates/ComfyUI-stable-diffusion-1.5/job-definition.json b/templates/ComfyUI-stable-diffusion-1.5/job-definition.json index 888630d..1ced592 100644 --- a/templates/ComfyUI-stable-diffusion-1.5/job-definition.json +++ b/templates/ComfyUI-stable-diffusion-1.5/job-definition.json @@ -2,21 +2,27 @@ "version": "0.1", "type": "container", "meta": { - "trigger": "cli" + "trigger": "benchmark" }, "ops": [ { "type": "container/run", - "id": "openai-whisper-asr-webservice", + "id": "comfy_stablediffusion", "args": { - "image": "docker.io/onerahmet/openai-whisper-asr-webservice:latest-gpu", - "cmd": [], + "cmd": [ + "/bin/sh", "-c", + "python -u main.py --listen --port 7860 --gpu-only" + ], + "image": "docker.io/nosana/sd-comfy-bench:1.0.0", "gpu": true, - "expose": 9000, - "env": { - "ASR_MODEL": "base", - "ASR_ENGINE": "openai_whisper" - } + "expose": 7860, + "resources": [ + { + "type": "S3", + "url": "https://models.nosana.io/stable-diffusion/1.5", + "target": "/comfyui/models/checkpoints" + } + ] } } ] diff --git a/templates/Forge-stable-diffusion-1.5/job-definition.json b/templates/Forge-stable-diffusion-1.5/job-definition.json index 4e8f0ff..4cc4c35 100644 --- a/templates/Forge-stable-diffusion-1.5/job-definition.json +++ b/templates/Forge-stable-diffusion-1.5/job-definition.json @@ -11,7 +11,7 @@ "args": { "cmd": [ "/bin/sh", "-c", - "python -u launch.py --api --listen --pytorch-deterministic --port 7861 --disable-xformers" + "python -u launch.py --api --listen --port 7861" ], "image": "docker.io/nosana/sd-forge-bench:1.0.0", "gpu": true, diff --git a/templates/Kohya-SS/README.md b/templates/Kohya-SS/README.md index 75000c5..68a9ba9 100644 --- a/templates/Kohya-SS/README.md +++ b/templates/Kohya-SS/README.md @@ -1,9 +1,5 @@ -# Oobabooga Text Generation WebUI +# Kohya SS GUI -![Oobabooga](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Oobabooga/oobabooga.mp4) +![Kohya SS GUI](https://raw.githubusercontent.com/nosana-ci/templates/main/templates/Kohya-ss/kohya-ss.gif) -Oobabooga Text Generation WebUI is a powerful and flexible interface for generating text using various AI models. It supports multiple backends, including Transformers, llama.cpp, and ExLlamaV2, providing a seamless experience for both professionals and enthusiasts. - -Unleash your creativity with Nosana! Effortlessly run an Oobabooga instance to generate sophisticated text content. Experience the power of advanced AI and GPU-backed nodes, ensuring efficient and high-quality text generation for your projects. - -Whether for personal use, research, or professional applications, Nosana provides the tools you need to harness the full potential of Oobabooga's capabilities. +Kohya SS GUI provides a user-friendly web interface for training and fine-tuning Stable Diffusion models using the Kohya SS scripts. It supports DreamBooth, LoRA, and fine-tuning, offering advanced features for efficient model training and customization. diff --git a/templates/Kohya-SS/info.json b/templates/Kohya-SS/info.json index e11df3b..56b9da1 100644 --- a/templates/Kohya-SS/info.json +++ b/templates/Kohya-SS/info.json @@ -1,7 +1,7 @@ { - "id": "whisper-asr-webservice", - "name": "Whisper ASR Webservice", - "description": "A robust speech recognition service powered by OpenAI's Whisper model, supporting multilingual transcription, translation, and language identification.", - "category": ["Featured"], - "icon": "https://www.datocms-assets.com/96965/1685731715-open-ai-stars-2x.png" + "id": "kohya-ss", + "name": "Kohya SS GUI", + "description": "A user-friendly web interface for training and fine-tuning Stable Diffusion models using Kohya SS scripts.", + "category": ["Model Fine-Tuning"], + "icon": "https://raw.githubusercontent.com/nosana-ci/templates/main/templates/Kohya-ss/kohya-ss.png" } diff --git a/templates/Kohya-SS/job-definition.json b/templates/Kohya-SS/job-definition.json index 888630d..a50c602 100644 --- a/templates/Kohya-SS/job-definition.json +++ b/templates/Kohya-SS/job-definition.json @@ -7,15 +7,15 @@ "ops": [ { "type": "container/run", - "id": "openai-whisper-asr-webservice", + "id": "kohya-ss-webservice", "args": { - "image": "docker.io/onerahmet/openai-whisper-asr-webservice:latest-gpu", - "cmd": [], + "image": "nosana/kohya_ss:1.0.0", + "cmd": ["python3", "kohya_gui.py", "--listen", "0.0.0.0", "--server_port", "7860", "--headless"], "gpu": true, - "expose": 9000, + "expose": 7860, "env": { - "ASR_MODEL": "base", - "ASR_ENGINE": "openai_whisper" + "NVIDIA_VISIBLE_DEVICES": "all", + "NVIDIA_DRIVER_CAPABILITIES": "compute,utility" } } } diff --git a/templates/VScode-server/README.md b/templates/VScode-server/README.md index 75000c5..02fd590 100644 --- a/templates/VScode-server/README.md +++ b/templates/VScode-server/README.md @@ -1,9 +1,68 @@ -# Oobabooga Text Generation WebUI +# VSCode Server -![Oobabooga](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Oobabooga/oobabooga.mp4) +![VSCode Server](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/vscode-server/vscode_server.mp4) -Oobabooga Text Generation WebUI is a powerful and flexible interface for generating text using various AI models. It supports multiple backends, including Transformers, llama.cpp, and ExLlamaV2, providing a seamless experience for both professionals and enthusiasts. +VSCode Server allows you to run Visual Studio Code on a remote server and access it through your browser. This setup provides a consistent and powerful development environment accessible from anywhere, whether you're on a Chromebook, tablet, laptop, or desktop. -Unleash your creativity with Nosana! Effortlessly run an Oobabooga instance to generate sophisticated text content. Experience the power of advanced AI and GPU-backed nodes, ensuring efficient and high-quality text generation for your projects. +**Key Features:** + +- **Remote Development:** Access your development environment from any device with a web browser. +- **Resource Efficiency:** Leverage powerful cloud servers to handle intensive computations, tests, compilations, and more. +- **Seamless Integration:** Easily integrate with GitHub by adding your SSH keys. +- **Customizable Environment:** Configure user and group IDs, timezone, and secure access with passwords. +- **Scalable:** Utilize GPU-backed nodes for enhanced performance when needed. + +**Unleash the power of remote development with Nosana!** Effortlessly deploy and manage your VSCode Server instance on high-performance GPU-backed nodes, ensuring a smooth and efficient coding experience for your projects. + +Whether you're developing software, managing repositories, or collaborating with a team, Nosana provides the infrastructure and tools you need to leverage VSCode Server effectively. + +## Getting Started + +1. **Deploy the Template:** + Use the Nosana platform to deploy the VSCode Server template. + +2. **Access the Web Interface:** + Navigate to `https://

` in your web browser to access the VSCode interface. + +3. **Configure GitHub Integration (Optional):** + - Add your SSH key to `/config/.ssh` for GitHub integration. + - Open a terminal within VSCode and set your GitHub username and email: + ```bash + git config --global user.name "your_username" + git config --global user.email "your_email@example.com" + ``` + +4. **Secure Your Instance:** + - Set a strong `SUDO_PASSWORD` in the environment variables to secure terminal access. + +## Configuration + +- **Environment Variables:** + - `PUID=1000`: User ID for file permissions. + - `PGID=1000`: Group ID for file permissions. + - `TZ=Etc/UTC`: Timezone setting. + - `SUDO_PASSWORD=password`: Password for sudo access in the terminal. + +- **Ports:** + - `8443`: Access the VSCode web interface. + +- **Volume Mappings:** + - `/config`: Contains all relevant configuration files and settings. + +## Notes + +- **GPU Requirements:** + - This container is configured to use GPU resources. Ensure your deployment node has a GPU with sufficient capabilities if needed. + +- **Security:** + - If `PASSWORD` or `HASHED_PASSWORD` is not set, there will be no authentication for the web interface. It's recommended to set at least one for security. + +- **Updating:** + - To update the container, pull the latest image and recreate the container using your deployment method (Docker Compose or Docker CLI). + +--- + +### **Directory Structure:** + +Ensure you create a new directory named `vscode-server` inside your `templates` directory. The structure should look like this: -Whether for personal use, research, or professional applications, Nosana provides the tools you need to harness the full potential of Oobabooga's capabilities. diff --git a/templates/Whisper-ASR-API/README.md b/templates/Whisper-ASR-API/README.md index 75000c5..d789228 100644 --- a/templates/Whisper-ASR-API/README.md +++ b/templates/Whisper-ASR-API/README.md @@ -1,9 +1,16 @@ -# Oobabooga Text Generation WebUI +# Whisper ASR Webservice -![Oobabooga](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Oobabooga/oobabooga.mp4) +![Whisper ASR Webservice](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/whisper-asr-webservice/whisper_asr_webservice.mp4) -Oobabooga Text Generation WebUI is a powerful and flexible interface for generating text using various AI models. It supports multiple backends, including Transformers, llama.cpp, and ExLlamaV2, providing a seamless experience for both professionals and enthusiasts. +Whisper ASR Webservice is a powerful speech recognition API built on OpenAI's Whisper model. It supports multilingual speech recognition, translation, and language identification, making it ideal for a wide range of applications from transcription services to real-time translation tools. -Unleash your creativity with Nosana! Effortlessly run an Oobabooga instance to generate sophisticated text content. Experience the power of advanced AI and GPU-backed nodes, ensuring efficient and high-quality text generation for your projects. +**Key Features:** -Whether for personal use, research, or professional applications, Nosana provides the tools you need to harness the full potential of Oobabooga's capabilities. +- **Multilingual Support:** Transcribe and translate audio in multiple languages. +- **Flexible Deployment:** Easily run on GPU-backed nodes for enhanced performance. +- **API Integration:** Seamlessly integrate with existing applications using the OpenAI-compatible API. +- **Scalable:** Designed to handle varying workloads efficiently. + +**Unleash the power of advanced speech recognition with Nosana!** Effortlessly deploy and manage your Whisper ASR Webservice instance on high-performance GPU-backed nodes, ensuring accurate and efficient transcription for your projects. + +Whether you're developing a transcription service, building real-time translation tools, or integrating speech recognition into your applications, Nosana provides the infrastructure and tools you need to leverage Whisper ASR Webservice effectively. From f78015cf8f1e819c28f11135439427f49056a822 Mon Sep 17 00:00:00 2001 From: KeesGeerligs <166137421+KeesGeerligs@users.noreply.github.com> Date: Mon, 18 Nov 2024 08:36:18 +0100 Subject: [PATCH 3/5] Added unrefined extra templates --- .../AUTOMATIC1111_stablediffusion.json | 30 + .../Axolotl_jupyter_notebook.json | 28 + .../ComfyUI_stablediffusion.json | 29 + .../Forge_stablediffusion.json | 30 + job_definition_templates/InvokeAI.json | 23 + job_definition_templates/Kohya_GUI.json | 23 + job_definition_templates/LMDeploy_API.json | 23 + job_definition_templates/Llama_factory.json | 23 + .../Nosana_RAG_bot_webui.json | 30 + .../Ollama-open-webui.json | 23 + job_definition_templates/Ollama.json | 19 + .../Onetrainer_jupyter_notebook.json | 28 + job_definition_templates/Oobabooga.json | 23 + .../Pytorch_jupyter_notebook.json | 28 + job_definition_templates/Rstudio.json | 24 + job_definition_templates/TGI_API.json | 24 + .../Tensorflow_jupyter_notebook.json | 19 + .../Text_To_Speech_generation_UI.json | 19 + job_definition_templates/VLLM_API.json | 24 + job_definition_templates/VScode_server.json | 25 + job_definition_templates/Whisper_ASR_API.json | 23 + .../repo-to-text_2024-11-18-07-08-09-UTC.txt | 643 ++++++++++++++++++ .../info.json | 2 +- .../job-definition.json | 2 +- templates/LMDeploy-API/README.md | 15 + templates/LMDeploy-API/info.json | 7 + templates/LMDeploy-API/job-definition.json | 23 + templates/Llama-Factory/README.md | 1 + templates/Llama-Factory/info.json | 1 + templates/Llama-Factory/job-definition.json | 1 + templates/Ollama-API/README.md | 1 + templates/Ollama-API/info.json | 1 + templates/Ollama-API/job-definition.json | 1 + .../Onetrainer-jupyter-notebook/README.md | 1 + .../Onetrainer-jupyter-notebook/info.json | 1 + .../job-definition.json | 1 + templates/TGI-API/README.md | 1 + templates/TGI-API/info.json | 1 + templates/TGI-API/job-definition.json | 1 + templates/Text-To-Speech-UI/README.md | 1 + templates/Text-To-Speech-UI/info.json | 1 + .../Text-To-Speech-UI/job-definition.json | 1 + templates/VLLM-API/README.md | 1 + templates/VLLM-API/info.json | 1 + templates/VLLM-API/job-definition.json | 1 + ... repo-to-text_2024-11-18-07-29-18-UTC.txt} | 276 +++++++- 46 files changed, 1485 insertions(+), 19 deletions(-) create mode 100644 job_definition_templates/AUTOMATIC1111_stablediffusion.json create mode 100644 job_definition_templates/Axolotl_jupyter_notebook.json create mode 100644 job_definition_templates/ComfyUI_stablediffusion.json create mode 100644 job_definition_templates/Forge_stablediffusion.json create mode 100644 job_definition_templates/InvokeAI.json create mode 100644 job_definition_templates/Kohya_GUI.json create mode 100644 job_definition_templates/LMDeploy_API.json create mode 100644 job_definition_templates/Llama_factory.json create mode 100644 job_definition_templates/Nosana_RAG_bot_webui.json create mode 100644 job_definition_templates/Ollama-open-webui.json create mode 100644 job_definition_templates/Ollama.json create mode 100644 job_definition_templates/Onetrainer_jupyter_notebook.json create mode 100644 job_definition_templates/Oobabooga.json create mode 100644 job_definition_templates/Pytorch_jupyter_notebook.json create mode 100644 job_definition_templates/Rstudio.json create mode 100644 job_definition_templates/TGI_API.json create mode 100644 job_definition_templates/Tensorflow_jupyter_notebook.json create mode 100644 job_definition_templates/Text_To_Speech_generation_UI.json create mode 100644 job_definition_templates/VLLM_API.json create mode 100644 job_definition_templates/VScode_server.json create mode 100644 job_definition_templates/Whisper_ASR_API.json create mode 100644 job_definition_templates/repo-to-text_2024-11-18-07-08-09-UTC.txt create mode 100644 templates/LMDeploy-API/README.md create mode 100644 templates/LMDeploy-API/info.json create mode 100644 templates/LMDeploy-API/job-definition.json create mode 100644 templates/Llama-Factory/README.md create mode 100644 templates/Llama-Factory/info.json create mode 100644 templates/Llama-Factory/job-definition.json create mode 100644 templates/Ollama-API/README.md create mode 100644 templates/Ollama-API/info.json create mode 100644 templates/Ollama-API/job-definition.json create mode 100644 templates/Onetrainer-jupyter-notebook/README.md create mode 100644 templates/Onetrainer-jupyter-notebook/info.json create mode 100644 templates/Onetrainer-jupyter-notebook/job-definition.json create mode 100644 templates/TGI-API/README.md create mode 100644 templates/TGI-API/info.json create mode 100644 templates/TGI-API/job-definition.json create mode 100644 templates/Text-To-Speech-UI/README.md create mode 100644 templates/Text-To-Speech-UI/info.json create mode 100644 templates/Text-To-Speech-UI/job-definition.json create mode 100644 templates/VLLM-API/README.md create mode 100644 templates/VLLM-API/info.json create mode 100644 templates/VLLM-API/job-definition.json rename templates/{repo-to-text_2024-11-13-15-00-53-UTC.txt => repo-to-text_2024-11-18-07-29-18-UTC.txt} (65%) diff --git a/job_definition_templates/AUTOMATIC1111_stablediffusion.json b/job_definition_templates/AUTOMATIC1111_stablediffusion.json new file mode 100644 index 0000000..7c5efd5 --- /dev/null +++ b/job_definition_templates/AUTOMATIC1111_stablediffusion.json @@ -0,0 +1,30 @@ +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "auto1111_stablediffusion", + "args": { + "cmd": [ + "/bin/sh", "-c", + "python -u launch.py --listen --port 7860 --enable-insecure-extension-access" + ], + "image": "docker.io/nosana/automatic1111:0.0.1", + "gpu": true, + "expose": 7860, + "resources": [ + { + "type": "S3", + "url": "https://models.nosana.io/stable-diffusion/1.5", + "target": "/stable-diffusion-webui/models/Stable-diffusion" + } + ] + + } + } + ] +} \ No newline at end of file diff --git a/job_definition_templates/Axolotl_jupyter_notebook.json b/job_definition_templates/Axolotl_jupyter_notebook.json new file mode 100644 index 0000000..538eea1 --- /dev/null +++ b/job_definition_templates/Axolotl_jupyter_notebook.json @@ -0,0 +1,28 @@ +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "axolotl", + "args": { + "image": "docker.io/winglian/axolotl-cloud:main-latest", + "cmd": [ + "jupyter", + "notebook", + "--ip=0.0.0.0", + "--port=8888", + "--no-browser", + "--allow-root", + "--ServerApp.token=''", + "--ServerApp.password=''" + ], + "expose": 8888, + "gpu": true + } + } + ] +} diff --git a/job_definition_templates/ComfyUI_stablediffusion.json b/job_definition_templates/ComfyUI_stablediffusion.json new file mode 100644 index 0000000..4ff3a03 --- /dev/null +++ b/job_definition_templates/ComfyUI_stablediffusion.json @@ -0,0 +1,29 @@ +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "benchmark" + }, + "ops": [ + { + "type": "container/run", + "id": "comfy_stablediffusion", + "args": { + "cmd": [ + "/bin/sh", "-c", + "python -u main.py --listen --port 7860 --gpu-only" + ], + "image": "docker.io/nosana/sd-comfy-manager:0.0.1", + "gpu": true, + "expose": 7860, + "resources": [ + { + "type": "S3", + "url": "https://models.nosana.io/stable-diffusion/1.5", + "target": "/comfyui/models/checkpoints" + } + ] + } + } + ] +} diff --git a/job_definition_templates/Forge_stablediffusion.json b/job_definition_templates/Forge_stablediffusion.json new file mode 100644 index 0000000..6a14d81 --- /dev/null +++ b/job_definition_templates/Forge_stablediffusion.json @@ -0,0 +1,30 @@ +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "forge_stablediffusion", + "args": { + "cmd": [ + "/bin/sh", "-c", + "python -u launch.py --api --listen --port 7861" + ], + "image": "docker.io/nosana/sd-forge-bench:1.0.0", + "gpu": true, + "expose": 7861, + "resources": [ + { + "type": "S3", + "url": "https://models.nosana.io/stable-diffusion/1.5", + "target": "/opt/stable-diffusion-webui-forge/models/Stable-diffusion" + } + ] + + } + } + ] +} \ No newline at end of file diff --git a/job_definition_templates/InvokeAI.json b/job_definition_templates/InvokeAI.json new file mode 100644 index 0000000..afbb2bf --- /dev/null +++ b/job_definition_templates/InvokeAI.json @@ -0,0 +1,23 @@ +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "benchmark" + }, + "ops": [ + { + "type": "container/run", + "id": "bench-SD-invoke", + "args": { + "cmd": [ + "/bin/sh", + "-c", + "invokeai-web" + ], + "image": "docker.io/nosana/sd-invoke-bench:1.0.0", + "gpu": true, + "expose": 9090 + } + } + ] + } \ No newline at end of file diff --git a/job_definition_templates/Kohya_GUI.json b/job_definition_templates/Kohya_GUI.json new file mode 100644 index 0000000..a50c602 --- /dev/null +++ b/job_definition_templates/Kohya_GUI.json @@ -0,0 +1,23 @@ +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "kohya-ss-webservice", + "args": { + "image": "nosana/kohya_ss:1.0.0", + "cmd": ["python3", "kohya_gui.py", "--listen", "0.0.0.0", "--server_port", "7860", "--headless"], + "gpu": true, + "expose": 7860, + "env": { + "NVIDIA_VISIBLE_DEVICES": "all", + "NVIDIA_DRIVER_CAPABILITIES": "compute,utility" + } + } + } + ] +} diff --git a/job_definition_templates/LMDeploy_API.json b/job_definition_templates/LMDeploy_API.json new file mode 100644 index 0000000..aedb3ab --- /dev/null +++ b/job_definition_templates/LMDeploy_API.json @@ -0,0 +1,23 @@ +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "benchmark" + }, + "ops": [ + { + "type": "container/run", + "id": "lmdepoy", + "args": { + "cmd": [ + "/bin/sh", + "-c", + "lmdeploy serve api_server Qwen/Qwen2.5-7B --model-name Qwen2.5-7B" + ], + "image": "docker.io/openmmlab/lmdeploy:latest", + "gpu": true, + "expose": 23333 + } + } + ] +} \ No newline at end of file diff --git a/job_definition_templates/Llama_factory.json b/job_definition_templates/Llama_factory.json new file mode 100644 index 0000000..7ebd595 --- /dev/null +++ b/job_definition_templates/Llama_factory.json @@ -0,0 +1,23 @@ +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "llama-factory", + "args": { + "image": "docker.io/nosana/llama-factory:0.0.0", + "cmd": [ + "/bin/sh", + "-c", + "llamafactory-cli webui" + ], + "gpu": true, + "expose": 7860 + } + } + ] +} diff --git a/job_definition_templates/Nosana_RAG_bot_webui.json b/job_definition_templates/Nosana_RAG_bot_webui.json new file mode 100644 index 0000000..5ee6082 --- /dev/null +++ b/job_definition_templates/Nosana_RAG_bot_webui.json @@ -0,0 +1,30 @@ +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "nosana-chat-bot", + "args": { + "image": "docker.io/nosana/nosana-chat-bot:0.1.1", + "cmd": [ + "-c", + "lmdeploy serve api_server ./models/snapshots/2123003760781134cfc31124aa6560a45b491fdf --model-name llama3.1 --chat-template ./chat_template.json --model-format awq & npm start" + ], + "gpu": true, + "expose": 3000, + "resources": [ + { + "type": "S3", + "url": "s3://nos-ai-models-qllsn32u/hugging-face/llama3.1/70b/4x/models--hugging-quants--Meta-Llama-3.1-70B-Instruct-AWQ-INT4", + "target": "/app/models/" + } + ] + } + } + ] +} + \ No newline at end of file diff --git a/job_definition_templates/Ollama-open-webui.json b/job_definition_templates/Ollama-open-webui.json new file mode 100644 index 0000000..44884b0 --- /dev/null +++ b/job_definition_templates/Ollama-open-webui.json @@ -0,0 +1,23 @@ +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "job-builder" + }, + "ops": [ + { + "type": "container/run", + "id": "open-webui", + "args": { + "cmd": [], + "env": { + "WEBUI_AUTH": "False", + "WEBUI_NAME": "Nosana Chat" + }, + "image": "ghcr.io/open-webui/open-webui:ollama", + "gpu": true, + "expose": 8080 + } + } + ] +} \ No newline at end of file diff --git a/job_definition_templates/Ollama.json b/job_definition_templates/Ollama.json new file mode 100644 index 0000000..c04514c --- /dev/null +++ b/job_definition_templates/Ollama.json @@ -0,0 +1,19 @@ +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "ollama-service", + "args": { + "image": "docker.io/ollama/ollama", + "cmd": [], + "gpu": true, + "expose": 11434 + } + } + ] +} diff --git a/job_definition_templates/Onetrainer_jupyter_notebook.json b/job_definition_templates/Onetrainer_jupyter_notebook.json new file mode 100644 index 0000000..175469f --- /dev/null +++ b/job_definition_templates/Onetrainer_jupyter_notebook.json @@ -0,0 +1,28 @@ +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "Onetrainer-UI", + "args": { + "image": "nosana/onetrainercomplete:0.0.0", + "cmd": [ + "jupyter", + "notebook", + "--ip=0.0.0.0", + "--port=8888", + "--no-browser", + "--allow-root", + "--ServerApp.token=''", + "--ServerApp.password=''" + ], + "expose": 8888, + "gpu": true + } + } + ] +} diff --git a/job_definition_templates/Oobabooga.json b/job_definition_templates/Oobabooga.json new file mode 100644 index 0000000..a9ac00f --- /dev/null +++ b/job_definition_templates/Oobabooga.json @@ -0,0 +1,23 @@ +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "Oobabooga-webui", + "args": { + "image": "docker.io/atinoda/text-generation-webui:latest", + "cmd": [], + "gpu": true, + "expose": 7860, + "env": { + "EXTRA_LAUNCH_ARGS": "--listen --verbose" + } + } + } + ] + } + \ No newline at end of file diff --git a/job_definition_templates/Pytorch_jupyter_notebook.json b/job_definition_templates/Pytorch_jupyter_notebook.json new file mode 100644 index 0000000..e9ec3c0 --- /dev/null +++ b/job_definition_templates/Pytorch_jupyter_notebook.json @@ -0,0 +1,28 @@ +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "pytorch", + "args": { + "image": "docker.io/nosana/pytorch-jupyter:0.0.0", + "cmd": [ + "jupyter", + "notebook", + "--ip=0.0.0.0", + "--port=8888", + "--no-browser", + "--allow-root", + "--ServerApp.token=''", + "--ServerApp.password=''" + ], + "expose": 8888, + "gpu": true + } + } + ] +} diff --git a/job_definition_templates/Rstudio.json b/job_definition_templates/Rstudio.json new file mode 100644 index 0000000..d283d10 --- /dev/null +++ b/job_definition_templates/Rstudio.json @@ -0,0 +1,24 @@ +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "rocker-rstudio", + "args": { + "image": "rocker/rstudio:latest", + "cmd": [], + "gpu": true, + "expose": 8787, + "env": { + "USER": "rstudio", + "PASSWORD": "password", + "RUNROOTLESS": "false" + } + } + } + ] +} diff --git a/job_definition_templates/TGI_API.json b/job_definition_templates/TGI_API.json new file mode 100644 index 0000000..d5968ed --- /dev/null +++ b/job_definition_templates/TGI_API.json @@ -0,0 +1,24 @@ +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "benchmark" + }, + "ops": [ + { + "type": "container/run", + "id": "tgi", + "args": { + "entrypoint": [], + "cmd": [ + "/bin/bash", + "-c", + "text-generation-launcher --model-id Qwen/Qwen2.5-7B --port 8080" + ], + "image": "ghcr.io/huggingface/text-generation-inference:2.3.1", + "gpu": true, + "expose": 8080 + } + } + ] +} \ No newline at end of file diff --git a/job_definition_templates/Tensorflow_jupyter_notebook.json b/job_definition_templates/Tensorflow_jupyter_notebook.json new file mode 100644 index 0000000..70c7d03 --- /dev/null +++ b/job_definition_templates/Tensorflow_jupyter_notebook.json @@ -0,0 +1,19 @@ +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "job-builder" + }, + "ops": [ + { + "type": "container/run", + "id": "jupyter-notebook", + "args": { + "cmd": "source /etc/bash.bashrc && jupyter notebook --notebook-dir=/tf --ip 0.0.0.0 --no-browser --allow-root --NotebookApp.token='' --NotebookApp.password=''", + "expose": 8888, + "image": "tensorflow/tensorflow:latest-gpu-jupyter", + "gpu": true + } + } + ] +} \ No newline at end of file diff --git a/job_definition_templates/Text_To_Speech_generation_UI.json b/job_definition_templates/Text_To_Speech_generation_UI.json new file mode 100644 index 0000000..7acfb5b --- /dev/null +++ b/job_definition_templates/Text_To_Speech_generation_UI.json @@ -0,0 +1,19 @@ +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "tts-generation-webui", + "args": { + "image": "ghcr.io/rsxdalv/tts-generation-webui:main", + "cmd": [], + "gpu": true, + "expose": 3000 + } + } + ] +} diff --git a/job_definition_templates/VLLM_API.json b/job_definition_templates/VLLM_API.json new file mode 100644 index 0000000..f20b91a --- /dev/null +++ b/job_definition_templates/VLLM_API.json @@ -0,0 +1,24 @@ +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "benchmark" + }, + "ops": [ + { + "type": "container/run", + "id": "vllm", + "args": { + "entrypoint": [], + "cmd": [ + "/bin/sh", + "-c", + "python3 -m vllm.entrypoints.openai.api_server --model Qwen/Qwen2.5-7B --served-model-name Qwen2.5-7B" + ], + "image": "docker.io/vllm/vllm-openai:v0.5.4", + "gpu": true, + "expose": 8080 + } + } + ] +} \ No newline at end of file diff --git a/job_definition_templates/VScode_server.json b/job_definition_templates/VScode_server.json new file mode 100644 index 0000000..6eac5cd --- /dev/null +++ b/job_definition_templates/VScode_server.json @@ -0,0 +1,25 @@ +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "code-server", + "args": { + "image": "lscr.io/linuxserver/code-server:latest", + "cmd": [], + "gpu": true, + "expose": 8443, + "env": { + "PUID": "1000", + "PGID": "1000", + "TZ": "Etc/UTC", + "SUDO_PASSWORD": "password" + } + } + } + ] +} diff --git a/job_definition_templates/Whisper_ASR_API.json b/job_definition_templates/Whisper_ASR_API.json new file mode 100644 index 0000000..888630d --- /dev/null +++ b/job_definition_templates/Whisper_ASR_API.json @@ -0,0 +1,23 @@ +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "openai-whisper-asr-webservice", + "args": { + "image": "docker.io/onerahmet/openai-whisper-asr-webservice:latest-gpu", + "cmd": [], + "gpu": true, + "expose": 9000, + "env": { + "ASR_MODEL": "base", + "ASR_ENGINE": "openai_whisper" + } + } + } + ] +} diff --git a/job_definition_templates/repo-to-text_2024-11-18-07-08-09-UTC.txt b/job_definition_templates/repo-to-text_2024-11-18-07-08-09-UTC.txt new file mode 100644 index 0000000..9ff1189 --- /dev/null +++ b/job_definition_templates/repo-to-text_2024-11-18-07-08-09-UTC.txt @@ -0,0 +1,643 @@ +Directory: job_definition_templates + +Directory Structure: +``` +. +. +|-- ./AUTOMATIC1111_stablediffusion.json +|-- ./Axolotl_jupyter_notebook.json +|-- ./ComfyUI_stablediffusion.json +|-- ./Forge_stablediffusion.json +|-- ./InvokeAI.json +|-- ./Kohya_GUI.json +|-- ./LMDeploy_API.json +|-- ./Llama_factory.json +|-- ./Nosana_RAG_bot_webui.json +|-- ./Ollama-open-webui.json +|-- ./Ollama.json +|-- ./Onetrainer_jupyter_notebook.json +|-- ./Oobabooga.json +|-- ./Pytorch_jupyter_notebook.json +|-- ./Rstudio.json +|-- ./TGI_API.json +|-- ./Tensorflow_jupyter_notebook.json +|-- ./Text_To_Speech_generation_UI.json +|-- ./VLLM_API.json +|-- ./VScode_server.json +|-- ./Whisper_ASR_API.json +`-- ./repo-to-text_2024-11-15-11-34-22-UTC.txt +``` + +Contents of AUTOMATIC1111_stablediffusion.json: +``` +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "auto1111_stablediffusion", + "args": { + "cmd": [ + "/bin/sh", "-c", + "python -u launch.py --listen --port 7860 --enable-insecure-extension-access" + ], + "image": "docker.io/nosana/automatic1111:0.0.1", + "gpu": true, + "expose": 7860, + "resources": [ + { + "type": "S3", + "url": "https://models.nosana.io/stable-diffusion/1.5", + "target": "/stable-diffusion-webui/models/Stable-diffusion" + } + ] + + } + } + ] +} +``` + +Contents of Axolotl_jupyter_notebook.json: +``` +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "axolotl", + "args": { + "image": "docker.io/winglian/axolotl-cloud:main-latest", + "cmd": [ + "jupyter", + "notebook", + "--ip=0.0.0.0", + "--port=8888", + "--no-browser", + "--allow-root", + "--ServerApp.token=''", + "--ServerApp.password=''" + ], + "expose": 8888, + "gpu": true + } + } + ] +} + +``` + +Contents of ComfyUI_stablediffusion.json: +``` +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "benchmark" + }, + "ops": [ + { + "type": "container/run", + "id": "comfy_stablediffusion", + "args": { + "cmd": [ + "/bin/sh", "-c", + "python -u main.py --listen --port 7860 --gpu-only" + ], + "image": "docker.io/nosana/sd-comfy-manager:0.0.1", + "gpu": true, + "expose": 7860, + "resources": [ + { + "type": "S3", + "url": "https://models.nosana.io/stable-diffusion/1.5", + "target": "/comfyui/models/checkpoints" + } + ] + } + } + ] +} + +``` + +Contents of Forge_stablediffusion.json: +``` +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "forge_stablediffusion", + "args": { + "cmd": [ + "/bin/sh", "-c", + "python -u launch.py --api --listen --port 7861" + ], + "image": "docker.io/nosana/sd-forge-bench:1.0.0", + "gpu": true, + "expose": 7861, + "resources": [ + { + "type": "S3", + "url": "https://models.nosana.io/stable-diffusion/1.5", + "target": "/opt/stable-diffusion-webui-forge/models/Stable-diffusion" + } + ] + + } + } + ] +} +``` + +Contents of InvokeAI.json: +``` +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "benchmark" + }, + "ops": [ + { + "type": "container/run", + "id": "bench-SD-invoke", + "args": { + "cmd": [ + "/bin/sh", + "-c", + "invokeai-web" + ], + "image": "docker.io/nosana/sd-invoke-bench:1.0.0", + "gpu": true, + "expose": 9090 + } + } + ] + } +``` + +Contents of Kohya_GUI.json: +``` +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "kohya-ss-webservice", + "args": { + "image": "nosana/kohya_ss:1.0.0", + "cmd": ["python3", "kohya_gui.py", "--listen", "0.0.0.0", "--server_port", "7860", "--headless"], + "gpu": true, + "expose": 7860, + "env": { + "NVIDIA_VISIBLE_DEVICES": "all", + "NVIDIA_DRIVER_CAPABILITIES": "compute,utility" + } + } + } + ] +} + +``` + +Contents of Llama_factory.json: +``` +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "llama-factory", + "args": { + "image": "docker.io/nosana/llama-factory:0.0.0", + "cmd": [ + "/bin/sh", + "-c", + "llamafactory-cli webui" + ], + "gpu": true, + "expose": 7860 + } + } + ] +} + +``` + +Contents of LMDeploy_API.json: +``` +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "benchmark" + }, + "ops": [ + { + "type": "container/run", + "id": "lmdepoy", + "args": { + "cmd": [ + "/bin/sh", + "-c", + "lmdeploy serve api_server Qwen/Qwen2.5-7B --model-name Qwen2.5-7B" + ], + "image": "docker.io/openmmlab/lmdeploy:latest", + "gpu": true, + "expose": 23333 + } + } + ] +} +``` + +Contents of Nosana_RAG_bot_webui.json: +``` +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "nosana-chat-bot", + "args": { + "image": "docker.io/nosana/nosana-chat-bot:0.1.1", + "cmd": [ + "-c", + "lmdeploy serve api_server ./models/snapshots/2123003760781134cfc31124aa6560a45b491fdf --model-name llama3.1 --chat-template ./chat_template.json --model-format awq & npm start" + ], + "gpu": true, + "expose": 3000, + "resources": [ + { + "type": "S3", + "url": "s3://nos-ai-models-qllsn32u/hugging-face/llama3.1/70b/4x/models--hugging-quants--Meta-Llama-3.1-70B-Instruct-AWQ-INT4", + "target": "/app/models/" + } + ] + } + } + ] +} + +``` + +Contents of Ollama-open-webui.json: +``` +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "job-builder" + }, + "ops": [ + { + "type": "container/run", + "id": "open-webui", + "args": { + "cmd": [], + "env": { + "WEBUI_AUTH": "False", + "WEBUI_NAME": "Nosana Chat" + }, + "image": "ghcr.io/open-webui/open-webui:ollama", + "gpu": true, + "expose": 8080 + } + } + ] +} +``` + +Contents of Ollama.json: +``` +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "ollama-service", + "args": { + "image": "docker.io/ollama/ollama", + "cmd": [], + "gpu": true, + "expose": 11434 + } + } + ] +} + +``` + +Contents of Onetrainer_jupyter_notebook.json: +``` +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "Onetrainer-UI", + "args": { + "image": "nosana/onetrainercomplete:0.0.0", + "cmd": [ + "jupyter", + "notebook", + "--ip=0.0.0.0", + "--port=8888", + "--no-browser", + "--allow-root", + "--ServerApp.token=''", + "--ServerApp.password=''" + ], + "expose": 8888, + "gpu": true + } + } + ] +} + +``` + +Contents of Oobabooga.json: +``` +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "Oobabooga-webui", + "args": { + "image": "docker.io/atinoda/text-generation-webui:latest", + "cmd": [], + "gpu": true, + "expose": 7860, + "env": { + "EXTRA_LAUNCH_ARGS": "--listen --verbose" + } + } + } + ] + } + +``` + +Contents of Pytorch_jupyter_notebook.json: +``` +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "pytorch", + "args": { + "image": "docker.io/nosana/pytorch-jupyter:0.0.0", + "cmd": [ + "jupyter", + "notebook", + "--ip=0.0.0.0", + "--port=8888", + "--no-browser", + "--allow-root", + "--ServerApp.token=''", + "--ServerApp.password=''" + ], + "expose": 8888, + "gpu": true + } + } + ] +} + +``` + +Contents of Rstudio.json: +``` +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "rocker-rstudio", + "args": { + "image": "rocker/rstudio:latest", + "cmd": [], + "gpu": true, + "expose": 8787, + "env": { + "USER": "rstudio", + "PASSWORD": "password", + "RUNROOTLESS": "false" + } + } + } + ] +} + +``` + +Contents of Tensorflow_jupyter_notebook.json: +``` +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "job-builder" + }, + "ops": [ + { + "type": "container/run", + "id": "jupyter-notebook", + "args": { + "cmd": "source /etc/bash.bashrc && jupyter notebook --notebook-dir=/tf --ip 0.0.0.0 --no-browser --allow-root --NotebookApp.token='' --NotebookApp.password=''", + "expose": 8888, + "image": "tensorflow/tensorflow:latest-gpu-jupyter", + "gpu": true + } + } + ] +} +``` + +Contents of Text_To_Speech_generation_UI.json: +``` +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "tts-generation-webui", + "args": { + "image": "ghcr.io/rsxdalv/tts-generation-webui:main", + "cmd": [], + "gpu": true, + "expose": 3000 + } + } + ] +} + +``` + +Contents of TGI_API.json: +``` +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "benchmark" + }, + "ops": [ + { + "type": "container/run", + "id": "tgi", + "args": { + "entrypoint": [], + "cmd": [ + "/bin/bash", + "-c", + "text-generation-launcher --model-id Qwen/Qwen2.5-7B --port 8080" + ], + "image": "ghcr.io/huggingface/text-generation-inference:2.3.1", + "gpu": true, + "expose": 8080 + } + } + ] +} +``` + +Contents of VLLM_API.json: +``` +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "benchmark" + }, + "ops": [ + { + "type": "container/run", + "id": "vllm", + "args": { + "entrypoint": [], + "cmd": [ + "/bin/sh", + "-c", + "python3 -m vllm.entrypoints.openai.api_server --model Qwen/Qwen2.5-7B --served-model-name Qwen2.5-7B" + ], + "image": "docker.io/vllm/vllm-openai:v0.5.4", + "gpu": true, + "expose": 8080 + } + } + ] +} +``` + +Contents of VScode_server.json: +``` +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "code-server", + "args": { + "image": "lscr.io/linuxserver/code-server:latest", + "cmd": [], + "gpu": true, + "expose": 8443, + "env": { + "PUID": "1000", + "PGID": "1000", + "TZ": "Etc/UTC", + "SUDO_PASSWORD": "password" + } + } + } + ] +} + +``` + +Contents of Whisper_ASR_API.json: +``` +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "openai-whisper-asr-webservice", + "args": { + "image": "docker.io/onerahmet/openai-whisper-asr-webservice:latest-gpu", + "cmd": [], + "gpu": true, + "expose": 9000, + "env": { + "ASR_MODEL": "base", + "ASR_ENGINE": "openai_whisper" + } + } + } + ] +} + +``` + diff --git a/templates/AUTOMATIC1111-stable-diffusion-1.5/info.json b/templates/AUTOMATIC1111-stable-diffusion-1.5/info.json index ab072d3..d42f126 100644 --- a/templates/AUTOMATIC1111-stable-diffusion-1.5/info.json +++ b/templates/AUTOMATIC1111-stable-diffusion-1.5/info.json @@ -1,6 +1,6 @@ { "id": "AUTOMTIC1111-stable-diffusion", - "name": "AUTOMTIC1111 Stable Diffusion 1.5", + "name": "AUTOMATIC1111 Stable Diffusion 1.5", "description": "Stable Diffusion is a latent text-to-image diffusion model", "category": ["Image Generation"], "icon": "https://private-user-images.githubusercontent.com/173618923/361423663-9ebdd0cf-02e2-497d-b87b-f98555396d23.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzE1MTEwOTUsIm5iZiI6MTczMTUxMDc5NSwicGF0aCI6Ii8xNzM2MTg5MjMvMzYxNDIzNjYzLTllYmRkMGNmLTAyZTItNDk3ZC1iODdiLWY5ODU1NTM5NmQyMy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQxMTEzJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MTExM1QxNTEzMTVaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1kNDI5MzVkM2I4NGY1NDViNzEzZDE5ZjYxNzJmYjdmOTM0MWU0OGI4OTg4OTgyZGY3NTUyZGQwODIwNzQzOGU2JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.o4AIHOfkVEEw-Su4HTmAQIzBvnxjcOB1BUiUDzUSZrs" diff --git a/templates/ComfyUI-stable-diffusion-1.5/job-definition.json b/templates/ComfyUI-stable-diffusion-1.5/job-definition.json index 1ced592..4ff3a03 100644 --- a/templates/ComfyUI-stable-diffusion-1.5/job-definition.json +++ b/templates/ComfyUI-stable-diffusion-1.5/job-definition.json @@ -13,7 +13,7 @@ "/bin/sh", "-c", "python -u main.py --listen --port 7860 --gpu-only" ], - "image": "docker.io/nosana/sd-comfy-bench:1.0.0", + "image": "docker.io/nosana/sd-comfy-manager:0.0.1", "gpu": true, "expose": 7860, "resources": [ diff --git a/templates/LMDeploy-API/README.md b/templates/LMDeploy-API/README.md new file mode 100644 index 0000000..bb0e7d5 --- /dev/null +++ b/templates/LMDeploy-API/README.md @@ -0,0 +1,15 @@ +# LMDeploy API + +LMDeploy is a high-performance inference engine for Large Language Models (LLMs). It provides quantization, optimization, and serving capabilities to efficiently deploy LLMs in production environments. + +## Key Features +- Optimized inference engine for LLMs +- Support for various model architectures +- Built-in quantization capabilities +- RESTful API interface +- GPU acceleration support + +## Configuration +- Port: 23333 +- Model: Qwen2.5-7B +- GPU: Required \ No newline at end of file diff --git a/templates/LMDeploy-API/info.json b/templates/LMDeploy-API/info.json new file mode 100644 index 0000000..42530da --- /dev/null +++ b/templates/LMDeploy-API/info.json @@ -0,0 +1,7 @@ +{ + "id": "lmdeploy-api", + "name": "LMDeploy API", + "description": "A high-performance inference engine for LLMs with quantization and optimization features", + "category": ["LLM", "API"], + "icon": "https://raw.githubusercontent.com/InternLM/lmdeploy/main/docs/en/_static/image/lmdeploy-logo.png" +} \ No newline at end of file diff --git a/templates/LMDeploy-API/job-definition.json b/templates/LMDeploy-API/job-definition.json new file mode 100644 index 0000000..d9621de --- /dev/null +++ b/templates/LMDeploy-API/job-definition.json @@ -0,0 +1,23 @@ +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "benchmark" + }, + "ops": [ + { + "type": "container/run", + "id": "lmdepoy", + "args": { + "cmd": [ + "/bin/sh", + "-c", + "lmdeploy serve api_server Qwen/Qwen2.5-7B --model-name Qwen2.5-7B" + ], + "image": "docker.io/openmmlab/lmdeploy:latest", + "gpu": true, + "expose": 23333 + } + } + ] +} \ No newline at end of file diff --git a/templates/Llama-Factory/README.md b/templates/Llama-Factory/README.md new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/templates/Llama-Factory/README.md @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/Llama-Factory/info.json b/templates/Llama-Factory/info.json new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/templates/Llama-Factory/info.json @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/Llama-Factory/job-definition.json b/templates/Llama-Factory/job-definition.json new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/templates/Llama-Factory/job-definition.json @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/Ollama-API/README.md b/templates/Ollama-API/README.md new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/templates/Ollama-API/README.md @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/Ollama-API/info.json b/templates/Ollama-API/info.json new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/templates/Ollama-API/info.json @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/Ollama-API/job-definition.json b/templates/Ollama-API/job-definition.json new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/templates/Ollama-API/job-definition.json @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/Onetrainer-jupyter-notebook/README.md b/templates/Onetrainer-jupyter-notebook/README.md new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/templates/Onetrainer-jupyter-notebook/README.md @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/Onetrainer-jupyter-notebook/info.json b/templates/Onetrainer-jupyter-notebook/info.json new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/templates/Onetrainer-jupyter-notebook/info.json @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/Onetrainer-jupyter-notebook/job-definition.json b/templates/Onetrainer-jupyter-notebook/job-definition.json new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/templates/Onetrainer-jupyter-notebook/job-definition.json @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/TGI-API/README.md b/templates/TGI-API/README.md new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/templates/TGI-API/README.md @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/TGI-API/info.json b/templates/TGI-API/info.json new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/templates/TGI-API/info.json @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/TGI-API/job-definition.json b/templates/TGI-API/job-definition.json new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/templates/TGI-API/job-definition.json @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/Text-To-Speech-UI/README.md b/templates/Text-To-Speech-UI/README.md new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/templates/Text-To-Speech-UI/README.md @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/Text-To-Speech-UI/info.json b/templates/Text-To-Speech-UI/info.json new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/templates/Text-To-Speech-UI/info.json @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/Text-To-Speech-UI/job-definition.json b/templates/Text-To-Speech-UI/job-definition.json new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/templates/Text-To-Speech-UI/job-definition.json @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/VLLM-API/README.md b/templates/VLLM-API/README.md new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/templates/VLLM-API/README.md @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/VLLM-API/info.json b/templates/VLLM-API/info.json new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/templates/VLLM-API/info.json @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/VLLM-API/job-definition.json b/templates/VLLM-API/job-definition.json new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/templates/VLLM-API/job-definition.json @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/repo-to-text_2024-11-13-15-00-53-UTC.txt b/templates/repo-to-text_2024-11-18-07-29-18-UTC.txt similarity index 65% rename from templates/repo-to-text_2024-11-13-15-00-53-UTC.txt rename to templates/repo-to-text_2024-11-18-07-29-18-UTC.txt index b842e13..d2fa0ff 100644 --- a/templates/repo-to-text_2024-11-13-15-00-53-UTC.txt +++ b/templates/repo-to-text_2024-11-18-07-29-18-UTC.txt @@ -3,6 +3,7 @@ Directory: templates Directory Structure: ``` . +. |-- ./AUTOMATIC1111-stable-diffusion-1.5 | |-- ./AUTOMATIC1111-stable-diffusion-1.5/README.md | |-- ./AUTOMATIC1111-stable-diffusion-1.5/info.json @@ -14,6 +15,14 @@ Directory Structure: | |-- ./Axolotl/axolotl.mp4 | |-- ./Axolotl/info.json | `-- ./Axolotl/job-definition.json +|-- ./ComfyUI-stable-diffusion-1.5 +| |-- ./ComfyUI-stable-diffusion-1.5/README.md +| |-- ./ComfyUI-stable-diffusion-1.5/info.json +| `-- ./ComfyUI-stable-diffusion-1.5/job-definition.json +|-- ./Forge-stable-diffusion-1.5 +| |-- ./Forge-stable-diffusion-1.5/README.md +| |-- ./Forge-stable-diffusion-1.5/info.json +| `-- ./Forge-stable-diffusion-1.5/job-definition.json |-- ./Hello-world | |-- ./Hello-world/README.md | |-- ./Hello-world/info.json @@ -23,6 +32,10 @@ Directory Structure: | |-- ./InvokeAI/info.json | |-- ./InvokeAI/invoke_ai.gif | `-- ./InvokeAI/job-definition.json +|-- ./Kohya-SS +| |-- ./Kohya-SS/README.md +| |-- ./Kohya-SS/info.json +| `-- ./Kohya-SS/job-definition.json |-- ./Nosana-RAG-bot-webui | |-- ./Nosana-RAG-bot-webui/README.md | |-- ./Nosana-RAG-bot-webui/info.json @@ -58,20 +71,21 @@ Directory Structure: | |-- ./VScode-server/README.md | |-- ./VScode-server/info.json | `-- ./VScode-server/job-definition.json -`-- ./Whisper-ASR-API - |-- ./Whisper-ASR-API/README.md - |-- ./Whisper-ASR-API/info.json - `-- ./Whisper-ASR-API/job-definition.json +|-- ./Whisper-ASR-API +| |-- ./Whisper-ASR-API/README.md +| |-- ./Whisper-ASR-API/info.json +| `-- ./Whisper-ASR-API/job-definition.json +`-- ./repo-to-text_2024-11-13-15-00-53-UTC.txt ``` Contents of AUTOMATIC1111-stable-diffusion-1.5\info.json: ``` { "id": "AUTOMTIC1111-stable-diffusion", - "name": "AUTOMTIC1111 Stable Diffusion", + "name": "AUTOMATIC1111 Stable Diffusion 1.5", "description": "Stable Diffusion is a latent text-to-image diffusion model", "category": ["Image Generation"], - "icon": "https://user-images.githubusercontent.com/36368048/196280761-1535f413-a91e-4b6a-af6a-b890f8ae204c.png" + "icon": "https://private-user-images.githubusercontent.com/173618923/361423663-9ebdd0cf-02e2-497d-b87b-f98555396d23.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzE1MTEwOTUsIm5iZiI6MTczMTUxMDc5NSwicGF0aCI6Ii8xNzM2MTg5MjMvMzYxNDIzNjYzLTllYmRkMGNmLTAyZTItNDk3ZC1iODdiLWY5ODU1NTM5NmQyMy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQxMTEzJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MTExM1QxNTEzMTVaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1kNDI5MzVkM2I4NGY1NDViNzEzZDE5ZjYxNzJmYjdmOTM0MWU0OGI4OTg4OTgyZGY3NTUyZGQwODIwNzQzOGU2JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.o4AIHOfkVEEw-Su4HTmAQIzBvnxjcOB1BUiUDzUSZrs" } ``` @@ -90,7 +104,7 @@ Contents of AUTOMATIC1111-stable-diffusion-1.5\job-definition.json: "args": { "cmd": [ "/bin/sh", "-c", - "python -u launch.py --listen --port 7860 --api" + "python -u launch.py --listen --port 7860 --enable-insecure-extension-access" ], "image": "docker.io/nosana/automatic1111:0.0.1", "gpu": true, @@ -201,6 +215,118 @@ Whether you're conducting research, developing applications, or exploring AI cap ``` +Contents of ComfyUI-stable-diffusion-1.5\info.json: +``` +{ + "id": "comfyui-stable-diffusion", + "name": "ComfyUI Stable Diffusion 1.5", + "description": "A powerful and modular Stable Diffusion GUI with a node-based interface.", + "category": ["Image Generation"], + "icon": "https://private-user-images.githubusercontent.com/75789136/253827723-a9445b86-a979-4467-be0b-750800e655a0.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzE1MTA1NTksIm5iZiI6MTczMTUxMDI1OSwicGF0aCI6Ii83NTc4OTEzNi8yNTM4Mjc3MjMtYTk0NDViODYtYTk3OS00NDY3LWJlMGItNzUwODAwZTY1NWEwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDExMTMlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQxMTEzVDE1MDQxOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTg4NDQ2MTU1ODU1NTMzMjg0MThhOTc4YTYwNTdjYWRiNDcwZjVkMTcxYWNjNjk3ODQ5NzUzOGUyYjVkMjA4ZWMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.VCLpIwvsIHD_gDZwATVKIyYHp0sfY6yIrpDLXfOdLDk" +} + +``` + +Contents of ComfyUI-stable-diffusion-1.5\job-definition.json: +``` +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "benchmark" + }, + "ops": [ + { + "type": "container/run", + "id": "comfy_stablediffusion", + "args": { + "cmd": [ + "/bin/sh", "-c", + "python -u main.py --listen --port 7860 --gpu-only" + ], + "image": "docker.io/nosana/sd-comfy-manager:0.0.1", + "gpu": true, + "expose": 7860, + "resources": [ + { + "type": "S3", + "url": "https://models.nosana.io/stable-diffusion/1.5", + "target": "/comfyui/models/checkpoints" + } + ] + } + } + ] +} + +``` + +Contents of ComfyUI-stable-diffusion-1.5\README.md: +``` +# ComfyUI Stable Diffusion + +![ComfyUI](https://raw.githubusercontent.com/nosana-ci/templates/main/templates/ComfyUI/comfyui.gif) + +ComfyUI is a powerful and modular Stable Diffusion GUI with a node-based interface, providing advanced control and flexibility for image generation. + +``` + +Contents of Forge-stable-diffusion-1.5\info.json: +``` +{ + "id": "forge-stable-diffusion", + "name": "Forge Stable Diffusion 1.5", + "description": "An optimized Stable Diffusion web UI with enhanced performance and features.", + "category": ["Image Generation"], + "icon": "https://private-user-images.githubusercontent.com/173618923/361423583-2dd6f478-e67a-4cc3-9b69-8a1c7728e06a.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzE1MTEwOTUsIm5iZiI6MTczMTUxMDc5NSwicGF0aCI6Ii8xNzM2MTg5MjMvMzYxNDIzNTgzLTJkZDZmNDc4LWU2N2EtNGNjMy05YjY5LThhMWM3NzI4ZTA2YS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQxMTEzJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MTExM1QxNTEzMTVaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1jY2JlNjg1MDUxM2I4YTZlYzg5MGQyMWE1Y2ViZjI1YTM1ZGViMTgwZDE4ZWY4ZWNmMjQyZDZlNDIyZGQ4NjFlJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.Ao9S1dPfnQPmzdlBJJjDJ1d0zN8mw8n1_Fp7d0F81pY" +} + +``` + +Contents of Forge-stable-diffusion-1.5\job-definition.json: +``` +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "forge_stablediffusion", + "args": { + "cmd": [ + "/bin/sh", "-c", + "python -u launch.py --api --listen --port 7861" + ], + "image": "docker.io/nosana/sd-forge-bench:1.0.0", + "gpu": true, + "expose": 7861, + "resources": [ + { + "type": "S3", + "url": "https://models.nosana.io/stable-diffusion/1.5", + "target": "/opt/stable-diffusion-webui-forge/models/Stable-diffusion" + } + ] + + } + } + ] +} +``` + +Contents of Forge-stable-diffusion-1.5\README.md: +``` +# Forge Stable Diffusion + +![Forge Stable Diffusion](https://raw.githubusercontent.com/nosana-ci/templates/main/templates/Forge-Stable-Diffusion/forge.gif) + +Forge Stable Diffusion is an optimized web UI for Stable Diffusion, offering enhanced performance and additional features for a superior image generation experience. + +``` + Contents of Hello-world\info.json: ``` { @@ -299,6 +425,56 @@ Unleash your creativity with Nosana! Effortlessly run an Invoke AI instance to g ``` +Contents of Kohya-SS\info.json: +``` +{ + "id": "kohya-ss", + "name": "Kohya SS GUI", + "description": "A user-friendly web interface for training and fine-tuning Stable Diffusion models using Kohya SS scripts.", + "category": ["Model Fine-Tuning"], + "icon": "https://raw.githubusercontent.com/nosana-ci/templates/main/templates/Kohya-ss/kohya-ss.png" +} + +``` + +Contents of Kohya-SS\job-definition.json: +``` +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "kohya-ss-webservice", + "args": { + "image": "nosana/kohya_ss:1.0.0", + "cmd": ["python3", "kohya_gui.py", "--listen", "0.0.0.0", "--server_port", "7860", "--headless"], + "gpu": true, + "expose": 7860, + "env": { + "NVIDIA_VISIBLE_DEVICES": "all", + "NVIDIA_DRIVER_CAPABILITIES": "compute,utility" + } + } + } + ] +} + +``` + +Contents of Kohya-SS\README.md: +``` +# Kohya SS GUI + +![Kohya SS GUI](https://raw.githubusercontent.com/nosana-ci/templates/main/templates/Kohya-ss/kohya-ss.gif) + +Kohya SS GUI provides a user-friendly web interface for training and fine-tuning Stable Diffusion models using the Kohya SS scripts. It supports DreamBooth, LoRA, and fine-tuning, offering advanced features for efficient model training and customization. + +``` + Contents of Nosana-RAG-bot-webui\info.json: ``` { @@ -729,15 +905,74 @@ Contents of VScode-server\job-definition.json: Contents of VScode-server\README.md: ``` -# Oobabooga Text Generation WebUI +# VSCode Server -![Oobabooga](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Oobabooga/oobabooga.mp4) +![VSCode Server](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/vscode-server/vscode_server.mp4) -Oobabooga Text Generation WebUI is a powerful and flexible interface for generating text using various AI models. It supports multiple backends, including Transformers, llama.cpp, and ExLlamaV2, providing a seamless experience for both professionals and enthusiasts. +VSCode Server allows you to run Visual Studio Code on a remote server and access it through your browser. This setup provides a consistent and powerful development environment accessible from anywhere, whether you're on a Chromebook, tablet, laptop, or desktop. -Unleash your creativity with Nosana! Effortlessly run an Oobabooga instance to generate sophisticated text content. Experience the power of advanced AI and GPU-backed nodes, ensuring efficient and high-quality text generation for your projects. +**Key Features:** + +- **Remote Development:** Access your development environment from any device with a web browser. +- **Resource Efficiency:** Leverage powerful cloud servers to handle intensive computations, tests, compilations, and more. +- **Seamless Integration:** Easily integrate with GitHub by adding your SSH keys. +- **Customizable Environment:** Configure user and group IDs, timezone, and secure access with passwords. +- **Scalable:** Utilize GPU-backed nodes for enhanced performance when needed. + +**Unleash the power of remote development with Nosana!** Effortlessly deploy and manage your VSCode Server instance on high-performance GPU-backed nodes, ensuring a smooth and efficient coding experience for your projects. + +Whether you're developing software, managing repositories, or collaborating with a team, Nosana provides the infrastructure and tools you need to leverage VSCode Server effectively. + +## Getting Started + +1. **Deploy the Template:** + Use the Nosana platform to deploy the VSCode Server template. + +2. **Access the Web Interface:** + Navigate to `https://
` in your web browser to access the VSCode interface. + +3. **Configure GitHub Integration (Optional):** + - Add your SSH key to `/config/.ssh` for GitHub integration. + - Open a terminal within VSCode and set your GitHub username and email: + ```bash + git config --global user.name "your_username" + git config --global user.email "your_email@example.com" + ``` + +4. **Secure Your Instance:** + - Set a strong `SUDO_PASSWORD` in the environment variables to secure terminal access. + +## Configuration + +- **Environment Variables:** + - `PUID=1000`: User ID for file permissions. + - `PGID=1000`: Group ID for file permissions. + - `TZ=Etc/UTC`: Timezone setting. + - `SUDO_PASSWORD=password`: Password for sudo access in the terminal. + +- **Ports:** + - `8443`: Access the VSCode web interface. + +- **Volume Mappings:** + - `/config`: Contains all relevant configuration files and settings. + +## Notes + +- **GPU Requirements:** + - This container is configured to use GPU resources. Ensure your deployment node has a GPU with sufficient capabilities if needed. + +- **Security:** + - If `PASSWORD` or `HASHED_PASSWORD` is not set, there will be no authentication for the web interface. It's recommended to set at least one for security. + +- **Updating:** + - To update the container, pull the latest image and recreate the container using your deployment method (Docker Compose or Docker CLI). + +--- + +### **Directory Structure:** + +Ensure you create a new directory named `vscode-server` inside your `templates` directory. The structure should look like this: -Whether for personal use, research, or professional applications, Nosana provides the tools you need to harness the full potential of Oobabooga's capabilities. ``` @@ -783,15 +1018,22 @@ Contents of Whisper-ASR-API\job-definition.json: Contents of Whisper-ASR-API\README.md: ``` -# Oobabooga Text Generation WebUI +# Whisper ASR Webservice -![Oobabooga](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Oobabooga/oobabooga.mp4) +![Whisper ASR Webservice](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/whisper-asr-webservice/whisper_asr_webservice.mp4) -Oobabooga Text Generation WebUI is a powerful and flexible interface for generating text using various AI models. It supports multiple backends, including Transformers, llama.cpp, and ExLlamaV2, providing a seamless experience for both professionals and enthusiasts. +Whisper ASR Webservice is a powerful speech recognition API built on OpenAI's Whisper model. It supports multilingual speech recognition, translation, and language identification, making it ideal for a wide range of applications from transcription services to real-time translation tools. -Unleash your creativity with Nosana! Effortlessly run an Oobabooga instance to generate sophisticated text content. Experience the power of advanced AI and GPU-backed nodes, ensuring efficient and high-quality text generation for your projects. +**Key Features:** -Whether for personal use, research, or professional applications, Nosana provides the tools you need to harness the full potential of Oobabooga's capabilities. +- **Multilingual Support:** Transcribe and translate audio in multiple languages. +- **Flexible Deployment:** Easily run on GPU-backed nodes for enhanced performance. +- **API Integration:** Seamlessly integrate with existing applications using the OpenAI-compatible API. +- **Scalable:** Designed to handle varying workloads efficiently. + +**Unleash the power of advanced speech recognition with Nosana!** Effortlessly deploy and manage your Whisper ASR Webservice instance on high-performance GPU-backed nodes, ensuring accurate and efficient transcription for your projects. + +Whether you're developing a transcription service, building real-time translation tools, or integrating speech recognition into your applications, Nosana provides the infrastructure and tools you need to leverage Whisper ASR Webservice effectively. ``` From 612f97a709d0c426e8ce8bf388cd2a3fa07ff32c Mon Sep 17 00:00:00 2001 From: KeesGeerligs <166137421+KeesGeerligs@users.noreply.github.com> Date: Mon, 18 Nov 2024 08:37:03 +0100 Subject: [PATCH 4/5] removed redundant stuff --- .../AUTOMATIC1111_stablediffusion.json | 30 - .../Axolotl_jupyter_notebook.json | 28 - .../ComfyUI_stablediffusion.json | 29 - .../Forge_stablediffusion.json | 30 - job_definition_templates/InvokeAI.json | 23 - job_definition_templates/Kohya_GUI.json | 23 - job_definition_templates/LMDeploy_API.json | 23 - job_definition_templates/Llama_factory.json | 23 - .../Nosana_RAG_bot_webui.json | 30 - .../Ollama-open-webui.json | 23 - job_definition_templates/Ollama.json | 19 - .../Onetrainer_jupyter_notebook.json | 28 - job_definition_templates/Oobabooga.json | 23 - .../Pytorch_jupyter_notebook.json | 28 - job_definition_templates/Rstudio.json | 24 - job_definition_templates/TGI_API.json | 24 - .../Tensorflow_jupyter_notebook.json | 19 - .../Text_To_Speech_generation_UI.json | 19 - job_definition_templates/VLLM_API.json | 24 - job_definition_templates/VScode_server.json | 25 - job_definition_templates/Whisper_ASR_API.json | 23 - .../repo-to-text_2024-11-18-07-08-09-UTC.txt | 643 ---------- .../repo-to-text_2024-11-18-07-29-18-UTC.txt | 1039 ----------------- 23 files changed, 2200 deletions(-) delete mode 100644 job_definition_templates/AUTOMATIC1111_stablediffusion.json delete mode 100644 job_definition_templates/Axolotl_jupyter_notebook.json delete mode 100644 job_definition_templates/ComfyUI_stablediffusion.json delete mode 100644 job_definition_templates/Forge_stablediffusion.json delete mode 100644 job_definition_templates/InvokeAI.json delete mode 100644 job_definition_templates/Kohya_GUI.json delete mode 100644 job_definition_templates/LMDeploy_API.json delete mode 100644 job_definition_templates/Llama_factory.json delete mode 100644 job_definition_templates/Nosana_RAG_bot_webui.json delete mode 100644 job_definition_templates/Ollama-open-webui.json delete mode 100644 job_definition_templates/Ollama.json delete mode 100644 job_definition_templates/Onetrainer_jupyter_notebook.json delete mode 100644 job_definition_templates/Oobabooga.json delete mode 100644 job_definition_templates/Pytorch_jupyter_notebook.json delete mode 100644 job_definition_templates/Rstudio.json delete mode 100644 job_definition_templates/TGI_API.json delete mode 100644 job_definition_templates/Tensorflow_jupyter_notebook.json delete mode 100644 job_definition_templates/Text_To_Speech_generation_UI.json delete mode 100644 job_definition_templates/VLLM_API.json delete mode 100644 job_definition_templates/VScode_server.json delete mode 100644 job_definition_templates/Whisper_ASR_API.json delete mode 100644 job_definition_templates/repo-to-text_2024-11-18-07-08-09-UTC.txt delete mode 100644 templates/repo-to-text_2024-11-18-07-29-18-UTC.txt diff --git a/job_definition_templates/AUTOMATIC1111_stablediffusion.json b/job_definition_templates/AUTOMATIC1111_stablediffusion.json deleted file mode 100644 index 7c5efd5..0000000 --- a/job_definition_templates/AUTOMATIC1111_stablediffusion.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "auto1111_stablediffusion", - "args": { - "cmd": [ - "/bin/sh", "-c", - "python -u launch.py --listen --port 7860 --enable-insecure-extension-access" - ], - "image": "docker.io/nosana/automatic1111:0.0.1", - "gpu": true, - "expose": 7860, - "resources": [ - { - "type": "S3", - "url": "https://models.nosana.io/stable-diffusion/1.5", - "target": "/stable-diffusion-webui/models/Stable-diffusion" - } - ] - - } - } - ] -} \ No newline at end of file diff --git a/job_definition_templates/Axolotl_jupyter_notebook.json b/job_definition_templates/Axolotl_jupyter_notebook.json deleted file mode 100644 index 538eea1..0000000 --- a/job_definition_templates/Axolotl_jupyter_notebook.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "axolotl", - "args": { - "image": "docker.io/winglian/axolotl-cloud:main-latest", - "cmd": [ - "jupyter", - "notebook", - "--ip=0.0.0.0", - "--port=8888", - "--no-browser", - "--allow-root", - "--ServerApp.token=''", - "--ServerApp.password=''" - ], - "expose": 8888, - "gpu": true - } - } - ] -} diff --git a/job_definition_templates/ComfyUI_stablediffusion.json b/job_definition_templates/ComfyUI_stablediffusion.json deleted file mode 100644 index 4ff3a03..0000000 --- a/job_definition_templates/ComfyUI_stablediffusion.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "benchmark" - }, - "ops": [ - { - "type": "container/run", - "id": "comfy_stablediffusion", - "args": { - "cmd": [ - "/bin/sh", "-c", - "python -u main.py --listen --port 7860 --gpu-only" - ], - "image": "docker.io/nosana/sd-comfy-manager:0.0.1", - "gpu": true, - "expose": 7860, - "resources": [ - { - "type": "S3", - "url": "https://models.nosana.io/stable-diffusion/1.5", - "target": "/comfyui/models/checkpoints" - } - ] - } - } - ] -} diff --git a/job_definition_templates/Forge_stablediffusion.json b/job_definition_templates/Forge_stablediffusion.json deleted file mode 100644 index 6a14d81..0000000 --- a/job_definition_templates/Forge_stablediffusion.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "forge_stablediffusion", - "args": { - "cmd": [ - "/bin/sh", "-c", - "python -u launch.py --api --listen --port 7861" - ], - "image": "docker.io/nosana/sd-forge-bench:1.0.0", - "gpu": true, - "expose": 7861, - "resources": [ - { - "type": "S3", - "url": "https://models.nosana.io/stable-diffusion/1.5", - "target": "/opt/stable-diffusion-webui-forge/models/Stable-diffusion" - } - ] - - } - } - ] -} \ No newline at end of file diff --git a/job_definition_templates/InvokeAI.json b/job_definition_templates/InvokeAI.json deleted file mode 100644 index afbb2bf..0000000 --- a/job_definition_templates/InvokeAI.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "benchmark" - }, - "ops": [ - { - "type": "container/run", - "id": "bench-SD-invoke", - "args": { - "cmd": [ - "/bin/sh", - "-c", - "invokeai-web" - ], - "image": "docker.io/nosana/sd-invoke-bench:1.0.0", - "gpu": true, - "expose": 9090 - } - } - ] - } \ No newline at end of file diff --git a/job_definition_templates/Kohya_GUI.json b/job_definition_templates/Kohya_GUI.json deleted file mode 100644 index a50c602..0000000 --- a/job_definition_templates/Kohya_GUI.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "kohya-ss-webservice", - "args": { - "image": "nosana/kohya_ss:1.0.0", - "cmd": ["python3", "kohya_gui.py", "--listen", "0.0.0.0", "--server_port", "7860", "--headless"], - "gpu": true, - "expose": 7860, - "env": { - "NVIDIA_VISIBLE_DEVICES": "all", - "NVIDIA_DRIVER_CAPABILITIES": "compute,utility" - } - } - } - ] -} diff --git a/job_definition_templates/LMDeploy_API.json b/job_definition_templates/LMDeploy_API.json deleted file mode 100644 index aedb3ab..0000000 --- a/job_definition_templates/LMDeploy_API.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "benchmark" - }, - "ops": [ - { - "type": "container/run", - "id": "lmdepoy", - "args": { - "cmd": [ - "/bin/sh", - "-c", - "lmdeploy serve api_server Qwen/Qwen2.5-7B --model-name Qwen2.5-7B" - ], - "image": "docker.io/openmmlab/lmdeploy:latest", - "gpu": true, - "expose": 23333 - } - } - ] -} \ No newline at end of file diff --git a/job_definition_templates/Llama_factory.json b/job_definition_templates/Llama_factory.json deleted file mode 100644 index 7ebd595..0000000 --- a/job_definition_templates/Llama_factory.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "llama-factory", - "args": { - "image": "docker.io/nosana/llama-factory:0.0.0", - "cmd": [ - "/bin/sh", - "-c", - "llamafactory-cli webui" - ], - "gpu": true, - "expose": 7860 - } - } - ] -} diff --git a/job_definition_templates/Nosana_RAG_bot_webui.json b/job_definition_templates/Nosana_RAG_bot_webui.json deleted file mode 100644 index 5ee6082..0000000 --- a/job_definition_templates/Nosana_RAG_bot_webui.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "nosana-chat-bot", - "args": { - "image": "docker.io/nosana/nosana-chat-bot:0.1.1", - "cmd": [ - "-c", - "lmdeploy serve api_server ./models/snapshots/2123003760781134cfc31124aa6560a45b491fdf --model-name llama3.1 --chat-template ./chat_template.json --model-format awq & npm start" - ], - "gpu": true, - "expose": 3000, - "resources": [ - { - "type": "S3", - "url": "s3://nos-ai-models-qllsn32u/hugging-face/llama3.1/70b/4x/models--hugging-quants--Meta-Llama-3.1-70B-Instruct-AWQ-INT4", - "target": "/app/models/" - } - ] - } - } - ] -} - \ No newline at end of file diff --git a/job_definition_templates/Ollama-open-webui.json b/job_definition_templates/Ollama-open-webui.json deleted file mode 100644 index 44884b0..0000000 --- a/job_definition_templates/Ollama-open-webui.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "job-builder" - }, - "ops": [ - { - "type": "container/run", - "id": "open-webui", - "args": { - "cmd": [], - "env": { - "WEBUI_AUTH": "False", - "WEBUI_NAME": "Nosana Chat" - }, - "image": "ghcr.io/open-webui/open-webui:ollama", - "gpu": true, - "expose": 8080 - } - } - ] -} \ No newline at end of file diff --git a/job_definition_templates/Ollama.json b/job_definition_templates/Ollama.json deleted file mode 100644 index c04514c..0000000 --- a/job_definition_templates/Ollama.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "ollama-service", - "args": { - "image": "docker.io/ollama/ollama", - "cmd": [], - "gpu": true, - "expose": 11434 - } - } - ] -} diff --git a/job_definition_templates/Onetrainer_jupyter_notebook.json b/job_definition_templates/Onetrainer_jupyter_notebook.json deleted file mode 100644 index 175469f..0000000 --- a/job_definition_templates/Onetrainer_jupyter_notebook.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "Onetrainer-UI", - "args": { - "image": "nosana/onetrainercomplete:0.0.0", - "cmd": [ - "jupyter", - "notebook", - "--ip=0.0.0.0", - "--port=8888", - "--no-browser", - "--allow-root", - "--ServerApp.token=''", - "--ServerApp.password=''" - ], - "expose": 8888, - "gpu": true - } - } - ] -} diff --git a/job_definition_templates/Oobabooga.json b/job_definition_templates/Oobabooga.json deleted file mode 100644 index a9ac00f..0000000 --- a/job_definition_templates/Oobabooga.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "Oobabooga-webui", - "args": { - "image": "docker.io/atinoda/text-generation-webui:latest", - "cmd": [], - "gpu": true, - "expose": 7860, - "env": { - "EXTRA_LAUNCH_ARGS": "--listen --verbose" - } - } - } - ] - } - \ No newline at end of file diff --git a/job_definition_templates/Pytorch_jupyter_notebook.json b/job_definition_templates/Pytorch_jupyter_notebook.json deleted file mode 100644 index e9ec3c0..0000000 --- a/job_definition_templates/Pytorch_jupyter_notebook.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "pytorch", - "args": { - "image": "docker.io/nosana/pytorch-jupyter:0.0.0", - "cmd": [ - "jupyter", - "notebook", - "--ip=0.0.0.0", - "--port=8888", - "--no-browser", - "--allow-root", - "--ServerApp.token=''", - "--ServerApp.password=''" - ], - "expose": 8888, - "gpu": true - } - } - ] -} diff --git a/job_definition_templates/Rstudio.json b/job_definition_templates/Rstudio.json deleted file mode 100644 index d283d10..0000000 --- a/job_definition_templates/Rstudio.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "rocker-rstudio", - "args": { - "image": "rocker/rstudio:latest", - "cmd": [], - "gpu": true, - "expose": 8787, - "env": { - "USER": "rstudio", - "PASSWORD": "password", - "RUNROOTLESS": "false" - } - } - } - ] -} diff --git a/job_definition_templates/TGI_API.json b/job_definition_templates/TGI_API.json deleted file mode 100644 index d5968ed..0000000 --- a/job_definition_templates/TGI_API.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "benchmark" - }, - "ops": [ - { - "type": "container/run", - "id": "tgi", - "args": { - "entrypoint": [], - "cmd": [ - "/bin/bash", - "-c", - "text-generation-launcher --model-id Qwen/Qwen2.5-7B --port 8080" - ], - "image": "ghcr.io/huggingface/text-generation-inference:2.3.1", - "gpu": true, - "expose": 8080 - } - } - ] -} \ No newline at end of file diff --git a/job_definition_templates/Tensorflow_jupyter_notebook.json b/job_definition_templates/Tensorflow_jupyter_notebook.json deleted file mode 100644 index 70c7d03..0000000 --- a/job_definition_templates/Tensorflow_jupyter_notebook.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "job-builder" - }, - "ops": [ - { - "type": "container/run", - "id": "jupyter-notebook", - "args": { - "cmd": "source /etc/bash.bashrc && jupyter notebook --notebook-dir=/tf --ip 0.0.0.0 --no-browser --allow-root --NotebookApp.token='' --NotebookApp.password=''", - "expose": 8888, - "image": "tensorflow/tensorflow:latest-gpu-jupyter", - "gpu": true - } - } - ] -} \ No newline at end of file diff --git a/job_definition_templates/Text_To_Speech_generation_UI.json b/job_definition_templates/Text_To_Speech_generation_UI.json deleted file mode 100644 index 7acfb5b..0000000 --- a/job_definition_templates/Text_To_Speech_generation_UI.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "tts-generation-webui", - "args": { - "image": "ghcr.io/rsxdalv/tts-generation-webui:main", - "cmd": [], - "gpu": true, - "expose": 3000 - } - } - ] -} diff --git a/job_definition_templates/VLLM_API.json b/job_definition_templates/VLLM_API.json deleted file mode 100644 index f20b91a..0000000 --- a/job_definition_templates/VLLM_API.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "benchmark" - }, - "ops": [ - { - "type": "container/run", - "id": "vllm", - "args": { - "entrypoint": [], - "cmd": [ - "/bin/sh", - "-c", - "python3 -m vllm.entrypoints.openai.api_server --model Qwen/Qwen2.5-7B --served-model-name Qwen2.5-7B" - ], - "image": "docker.io/vllm/vllm-openai:v0.5.4", - "gpu": true, - "expose": 8080 - } - } - ] -} \ No newline at end of file diff --git a/job_definition_templates/VScode_server.json b/job_definition_templates/VScode_server.json deleted file mode 100644 index 6eac5cd..0000000 --- a/job_definition_templates/VScode_server.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "code-server", - "args": { - "image": "lscr.io/linuxserver/code-server:latest", - "cmd": [], - "gpu": true, - "expose": 8443, - "env": { - "PUID": "1000", - "PGID": "1000", - "TZ": "Etc/UTC", - "SUDO_PASSWORD": "password" - } - } - } - ] -} diff --git a/job_definition_templates/Whisper_ASR_API.json b/job_definition_templates/Whisper_ASR_API.json deleted file mode 100644 index 888630d..0000000 --- a/job_definition_templates/Whisper_ASR_API.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "openai-whisper-asr-webservice", - "args": { - "image": "docker.io/onerahmet/openai-whisper-asr-webservice:latest-gpu", - "cmd": [], - "gpu": true, - "expose": 9000, - "env": { - "ASR_MODEL": "base", - "ASR_ENGINE": "openai_whisper" - } - } - } - ] -} diff --git a/job_definition_templates/repo-to-text_2024-11-18-07-08-09-UTC.txt b/job_definition_templates/repo-to-text_2024-11-18-07-08-09-UTC.txt deleted file mode 100644 index 9ff1189..0000000 --- a/job_definition_templates/repo-to-text_2024-11-18-07-08-09-UTC.txt +++ /dev/null @@ -1,643 +0,0 @@ -Directory: job_definition_templates - -Directory Structure: -``` -. -. -|-- ./AUTOMATIC1111_stablediffusion.json -|-- ./Axolotl_jupyter_notebook.json -|-- ./ComfyUI_stablediffusion.json -|-- ./Forge_stablediffusion.json -|-- ./InvokeAI.json -|-- ./Kohya_GUI.json -|-- ./LMDeploy_API.json -|-- ./Llama_factory.json -|-- ./Nosana_RAG_bot_webui.json -|-- ./Ollama-open-webui.json -|-- ./Ollama.json -|-- ./Onetrainer_jupyter_notebook.json -|-- ./Oobabooga.json -|-- ./Pytorch_jupyter_notebook.json -|-- ./Rstudio.json -|-- ./TGI_API.json -|-- ./Tensorflow_jupyter_notebook.json -|-- ./Text_To_Speech_generation_UI.json -|-- ./VLLM_API.json -|-- ./VScode_server.json -|-- ./Whisper_ASR_API.json -`-- ./repo-to-text_2024-11-15-11-34-22-UTC.txt -``` - -Contents of AUTOMATIC1111_stablediffusion.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "auto1111_stablediffusion", - "args": { - "cmd": [ - "/bin/sh", "-c", - "python -u launch.py --listen --port 7860 --enable-insecure-extension-access" - ], - "image": "docker.io/nosana/automatic1111:0.0.1", - "gpu": true, - "expose": 7860, - "resources": [ - { - "type": "S3", - "url": "https://models.nosana.io/stable-diffusion/1.5", - "target": "/stable-diffusion-webui/models/Stable-diffusion" - } - ] - - } - } - ] -} -``` - -Contents of Axolotl_jupyter_notebook.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "axolotl", - "args": { - "image": "docker.io/winglian/axolotl-cloud:main-latest", - "cmd": [ - "jupyter", - "notebook", - "--ip=0.0.0.0", - "--port=8888", - "--no-browser", - "--allow-root", - "--ServerApp.token=''", - "--ServerApp.password=''" - ], - "expose": 8888, - "gpu": true - } - } - ] -} - -``` - -Contents of ComfyUI_stablediffusion.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "benchmark" - }, - "ops": [ - { - "type": "container/run", - "id": "comfy_stablediffusion", - "args": { - "cmd": [ - "/bin/sh", "-c", - "python -u main.py --listen --port 7860 --gpu-only" - ], - "image": "docker.io/nosana/sd-comfy-manager:0.0.1", - "gpu": true, - "expose": 7860, - "resources": [ - { - "type": "S3", - "url": "https://models.nosana.io/stable-diffusion/1.5", - "target": "/comfyui/models/checkpoints" - } - ] - } - } - ] -} - -``` - -Contents of Forge_stablediffusion.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "forge_stablediffusion", - "args": { - "cmd": [ - "/bin/sh", "-c", - "python -u launch.py --api --listen --port 7861" - ], - "image": "docker.io/nosana/sd-forge-bench:1.0.0", - "gpu": true, - "expose": 7861, - "resources": [ - { - "type": "S3", - "url": "https://models.nosana.io/stable-diffusion/1.5", - "target": "/opt/stable-diffusion-webui-forge/models/Stable-diffusion" - } - ] - - } - } - ] -} -``` - -Contents of InvokeAI.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "benchmark" - }, - "ops": [ - { - "type": "container/run", - "id": "bench-SD-invoke", - "args": { - "cmd": [ - "/bin/sh", - "-c", - "invokeai-web" - ], - "image": "docker.io/nosana/sd-invoke-bench:1.0.0", - "gpu": true, - "expose": 9090 - } - } - ] - } -``` - -Contents of Kohya_GUI.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "kohya-ss-webservice", - "args": { - "image": "nosana/kohya_ss:1.0.0", - "cmd": ["python3", "kohya_gui.py", "--listen", "0.0.0.0", "--server_port", "7860", "--headless"], - "gpu": true, - "expose": 7860, - "env": { - "NVIDIA_VISIBLE_DEVICES": "all", - "NVIDIA_DRIVER_CAPABILITIES": "compute,utility" - } - } - } - ] -} - -``` - -Contents of Llama_factory.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "llama-factory", - "args": { - "image": "docker.io/nosana/llama-factory:0.0.0", - "cmd": [ - "/bin/sh", - "-c", - "llamafactory-cli webui" - ], - "gpu": true, - "expose": 7860 - } - } - ] -} - -``` - -Contents of LMDeploy_API.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "benchmark" - }, - "ops": [ - { - "type": "container/run", - "id": "lmdepoy", - "args": { - "cmd": [ - "/bin/sh", - "-c", - "lmdeploy serve api_server Qwen/Qwen2.5-7B --model-name Qwen2.5-7B" - ], - "image": "docker.io/openmmlab/lmdeploy:latest", - "gpu": true, - "expose": 23333 - } - } - ] -} -``` - -Contents of Nosana_RAG_bot_webui.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "nosana-chat-bot", - "args": { - "image": "docker.io/nosana/nosana-chat-bot:0.1.1", - "cmd": [ - "-c", - "lmdeploy serve api_server ./models/snapshots/2123003760781134cfc31124aa6560a45b491fdf --model-name llama3.1 --chat-template ./chat_template.json --model-format awq & npm start" - ], - "gpu": true, - "expose": 3000, - "resources": [ - { - "type": "S3", - "url": "s3://nos-ai-models-qllsn32u/hugging-face/llama3.1/70b/4x/models--hugging-quants--Meta-Llama-3.1-70B-Instruct-AWQ-INT4", - "target": "/app/models/" - } - ] - } - } - ] -} - -``` - -Contents of Ollama-open-webui.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "job-builder" - }, - "ops": [ - { - "type": "container/run", - "id": "open-webui", - "args": { - "cmd": [], - "env": { - "WEBUI_AUTH": "False", - "WEBUI_NAME": "Nosana Chat" - }, - "image": "ghcr.io/open-webui/open-webui:ollama", - "gpu": true, - "expose": 8080 - } - } - ] -} -``` - -Contents of Ollama.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "ollama-service", - "args": { - "image": "docker.io/ollama/ollama", - "cmd": [], - "gpu": true, - "expose": 11434 - } - } - ] -} - -``` - -Contents of Onetrainer_jupyter_notebook.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "Onetrainer-UI", - "args": { - "image": "nosana/onetrainercomplete:0.0.0", - "cmd": [ - "jupyter", - "notebook", - "--ip=0.0.0.0", - "--port=8888", - "--no-browser", - "--allow-root", - "--ServerApp.token=''", - "--ServerApp.password=''" - ], - "expose": 8888, - "gpu": true - } - } - ] -} - -``` - -Contents of Oobabooga.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "Oobabooga-webui", - "args": { - "image": "docker.io/atinoda/text-generation-webui:latest", - "cmd": [], - "gpu": true, - "expose": 7860, - "env": { - "EXTRA_LAUNCH_ARGS": "--listen --verbose" - } - } - } - ] - } - -``` - -Contents of Pytorch_jupyter_notebook.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "pytorch", - "args": { - "image": "docker.io/nosana/pytorch-jupyter:0.0.0", - "cmd": [ - "jupyter", - "notebook", - "--ip=0.0.0.0", - "--port=8888", - "--no-browser", - "--allow-root", - "--ServerApp.token=''", - "--ServerApp.password=''" - ], - "expose": 8888, - "gpu": true - } - } - ] -} - -``` - -Contents of Rstudio.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "rocker-rstudio", - "args": { - "image": "rocker/rstudio:latest", - "cmd": [], - "gpu": true, - "expose": 8787, - "env": { - "USER": "rstudio", - "PASSWORD": "password", - "RUNROOTLESS": "false" - } - } - } - ] -} - -``` - -Contents of Tensorflow_jupyter_notebook.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "job-builder" - }, - "ops": [ - { - "type": "container/run", - "id": "jupyter-notebook", - "args": { - "cmd": "source /etc/bash.bashrc && jupyter notebook --notebook-dir=/tf --ip 0.0.0.0 --no-browser --allow-root --NotebookApp.token='' --NotebookApp.password=''", - "expose": 8888, - "image": "tensorflow/tensorflow:latest-gpu-jupyter", - "gpu": true - } - } - ] -} -``` - -Contents of Text_To_Speech_generation_UI.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "tts-generation-webui", - "args": { - "image": "ghcr.io/rsxdalv/tts-generation-webui:main", - "cmd": [], - "gpu": true, - "expose": 3000 - } - } - ] -} - -``` - -Contents of TGI_API.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "benchmark" - }, - "ops": [ - { - "type": "container/run", - "id": "tgi", - "args": { - "entrypoint": [], - "cmd": [ - "/bin/bash", - "-c", - "text-generation-launcher --model-id Qwen/Qwen2.5-7B --port 8080" - ], - "image": "ghcr.io/huggingface/text-generation-inference:2.3.1", - "gpu": true, - "expose": 8080 - } - } - ] -} -``` - -Contents of VLLM_API.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "benchmark" - }, - "ops": [ - { - "type": "container/run", - "id": "vllm", - "args": { - "entrypoint": [], - "cmd": [ - "/bin/sh", - "-c", - "python3 -m vllm.entrypoints.openai.api_server --model Qwen/Qwen2.5-7B --served-model-name Qwen2.5-7B" - ], - "image": "docker.io/vllm/vllm-openai:v0.5.4", - "gpu": true, - "expose": 8080 - } - } - ] -} -``` - -Contents of VScode_server.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "code-server", - "args": { - "image": "lscr.io/linuxserver/code-server:latest", - "cmd": [], - "gpu": true, - "expose": 8443, - "env": { - "PUID": "1000", - "PGID": "1000", - "TZ": "Etc/UTC", - "SUDO_PASSWORD": "password" - } - } - } - ] -} - -``` - -Contents of Whisper_ASR_API.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "openai-whisper-asr-webservice", - "args": { - "image": "docker.io/onerahmet/openai-whisper-asr-webservice:latest-gpu", - "cmd": [], - "gpu": true, - "expose": 9000, - "env": { - "ASR_MODEL": "base", - "ASR_ENGINE": "openai_whisper" - } - } - } - ] -} - -``` - diff --git a/templates/repo-to-text_2024-11-18-07-29-18-UTC.txt b/templates/repo-to-text_2024-11-18-07-29-18-UTC.txt deleted file mode 100644 index d2fa0ff..0000000 --- a/templates/repo-to-text_2024-11-18-07-29-18-UTC.txt +++ /dev/null @@ -1,1039 +0,0 @@ -Directory: templates - -Directory Structure: -``` -. -. -|-- ./AUTOMATIC1111-stable-diffusion-1.5 -| |-- ./AUTOMATIC1111-stable-diffusion-1.5/README.md -| |-- ./AUTOMATIC1111-stable-diffusion-1.5/info.json -| |-- ./AUTOMATIC1111-stable-diffusion-1.5/job-definition.json -| `-- ./AUTOMATIC1111-stable-diffusion-1.5/stable_diff.gif -|-- ./Axolotl -| |-- ./Axolotl/README.md -| |-- ./Axolotl/axolotl-nobackground.png -| |-- ./Axolotl/axolotl.mp4 -| |-- ./Axolotl/info.json -| `-- ./Axolotl/job-definition.json -|-- ./ComfyUI-stable-diffusion-1.5 -| |-- ./ComfyUI-stable-diffusion-1.5/README.md -| |-- ./ComfyUI-stable-diffusion-1.5/info.json -| `-- ./ComfyUI-stable-diffusion-1.5/job-definition.json -|-- ./Forge-stable-diffusion-1.5 -| |-- ./Forge-stable-diffusion-1.5/README.md -| |-- ./Forge-stable-diffusion-1.5/info.json -| `-- ./Forge-stable-diffusion-1.5/job-definition.json -|-- ./Hello-world -| |-- ./Hello-world/README.md -| |-- ./Hello-world/info.json -| `-- ./Hello-world/job-definition.json -|-- ./InvokeAI -| |-- ./InvokeAI/README.md -| |-- ./InvokeAI/info.json -| |-- ./InvokeAI/invoke_ai.gif -| `-- ./InvokeAI/job-definition.json -|-- ./Kohya-SS -| |-- ./Kohya-SS/README.md -| |-- ./Kohya-SS/info.json -| `-- ./Kohya-SS/job-definition.json -|-- ./Nosana-RAG-bot-webui -| |-- ./Nosana-RAG-bot-webui/README.md -| |-- ./Nosana-RAG-bot-webui/info.json -| |-- ./Nosana-RAG-bot-webui/job-definition.json -| `-- ./Nosana-RAG-bot-webui/nosana_bot.mp4 -|-- ./Oobabooga -| |-- ./Oobabooga/README.md -| |-- ./Oobabooga/info.json -| |-- ./Oobabooga/job-definition.json -| |-- ./Oobabooga/oobabooga.gif -| |-- ./Oobabooga/oobabooga.mp4 -| `-- ./Oobabooga/oobabooga.png -|-- ./Open-webui-ollama -| |-- ./Open-webui-ollama/README.md -| |-- ./Open-webui-ollama/info.json -| |-- ./Open-webui-ollama/job-definition.json -| `-- ./Open-webui-ollama/openwebui.gif -|-- ./Pytorch-jupyter-notebook -| |-- ./Pytorch-jupyter-notebook/README.md -| |-- ./Pytorch-jupyter-notebook/info.json -| |-- ./Pytorch-jupyter-notebook/job-definition.json -| `-- ./Pytorch-jupyter-notebook/jupyter.gif -|-- ./Rstudio -| |-- ./Rstudio/README.md -| |-- ./Rstudio/info.json -| `-- ./Rstudio/job-definition.json -|-- ./Tensorflow-jupyter-notebook -| |-- ./Tensorflow-jupyter-notebook/README.md -| |-- ./Tensorflow-jupyter-notebook/info.json -| |-- ./Tensorflow-jupyter-notebook/job-definition.json -| `-- ./Tensorflow-jupyter-notebook/jupyter.gif -|-- ./VScode-server -| |-- ./VScode-server/README.md -| |-- ./VScode-server/info.json -| `-- ./VScode-server/job-definition.json -|-- ./Whisper-ASR-API -| |-- ./Whisper-ASR-API/README.md -| |-- ./Whisper-ASR-API/info.json -| `-- ./Whisper-ASR-API/job-definition.json -`-- ./repo-to-text_2024-11-13-15-00-53-UTC.txt -``` - -Contents of AUTOMATIC1111-stable-diffusion-1.5\info.json: -``` -{ - "id": "AUTOMTIC1111-stable-diffusion", - "name": "AUTOMATIC1111 Stable Diffusion 1.5", - "description": "Stable Diffusion is a latent text-to-image diffusion model", - "category": ["Image Generation"], - "icon": "https://private-user-images.githubusercontent.com/173618923/361423663-9ebdd0cf-02e2-497d-b87b-f98555396d23.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzE1MTEwOTUsIm5iZiI6MTczMTUxMDc5NSwicGF0aCI6Ii8xNzM2MTg5MjMvMzYxNDIzNjYzLTllYmRkMGNmLTAyZTItNDk3ZC1iODdiLWY5ODU1NTM5NmQyMy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQxMTEzJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MTExM1QxNTEzMTVaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1kNDI5MzVkM2I4NGY1NDViNzEzZDE5ZjYxNzJmYjdmOTM0MWU0OGI4OTg4OTgyZGY3NTUyZGQwODIwNzQzOGU2JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.o4AIHOfkVEEw-Su4HTmAQIzBvnxjcOB1BUiUDzUSZrs" -} -``` - -Contents of AUTOMATIC1111-stable-diffusion-1.5\job-definition.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "auto1111_stablediffusion", - "args": { - "cmd": [ - "/bin/sh", "-c", - "python -u launch.py --listen --port 7860 --enable-insecure-extension-access" - ], - "image": "docker.io/nosana/automatic1111:0.0.1", - "gpu": true, - "expose": 7860, - "resources": [ - { - "type": "S3", - "url": "https://models.nosana.io/stable-diffusion/1.5", - "target": "/stable-diffusion-webui/models/Stable-diffusion" - } - ] - - } - } - ] -} -``` - -Contents of AUTOMATIC1111-stable-diffusion-1.5\README.md: -``` -# Stable Diffusion WebUI - -![Stable Diffusion WebUI](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/AUTOMATIC1111-stable-diffusion/stable_diff.gif) - -[Stable Diffusion WebUI](https://github.com/AUTOMATIC1111/stable-diffusion-webui) is a web interface for Stable Diffusion, implemented using Gradio library. - -Unleash your creativity with Nosana! Effortlessly run a Stable Diffusion instance to generate stunning images. -Experience the power of advanced AI and GPU-backed nodes, making your image creation process smooth and efficient. -Whether for personal projects or professional work, Nosana provides the tools you need to bring your artistic visions to life. - - -``` - -Contents of AUTOMATIC1111-stable-diffusion-1.5\stable_diff.gif: -``` -[Could not decode file contents] - -``` - -Contents of Axolotl\axolotl-nobackground.png: -``` -[Could not decode file contents] - -``` - -Contents of Axolotl\axolotl.mp4: -``` -[Could not decode file contents] - -``` - -Contents of Axolotl\info.json: -``` -{ - "id": "axolotl", - "name": "Axolotl finetuning LLM's", - "description": "Axolotl streamlines the fine-tuning of various AI models, supporting multiple configurations and architectures for efficient and flexible model training.", - "category": ["Model Fine-Tuning"], - "icon": "https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Axolotl/axolotl-nobackground.png" -} - -``` - -Contents of Axolotl\job-definition.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "axolotl", - "args": { - "image": "docker.io/winglian/axolotl-cloud:main-latest", - "cmd": [ - "jupyter", - "notebook", - "--ip=0.0.0.0", - "--port=8888", - "--no-browser", - "--allow-root", - "--ServerApp.token=''", - "--ServerApp.password=''" - ], - "expose": 8888, - "gpu": true - } - } - ] -} - -``` - -Contents of Axolotl\README.md: -``` -# Axolotl - -![Axolotl](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Axolotl/axolotl.mp4) - -Axolotl is a powerful tool designed to streamline the fine-tuning of various AI models, offering support for multiple configurations and architectures. It enables efficient training with single or multiple GPUs, making it ideal for both personal and professional projects. - -Unleash your potential with Nosana! Effortlessly run an Axolotl instance to fine-tune your AI models with ease. Experience the flexibility and power of advanced AI and GPU-backed nodes, ensuring your model training processes are smooth and effective. - -Whether you're conducting research, developing applications, or exploring AI capabilities, Nosana provides the essential tools to leverage Axolotl's full potential. - -``` - -Contents of ComfyUI-stable-diffusion-1.5\info.json: -``` -{ - "id": "comfyui-stable-diffusion", - "name": "ComfyUI Stable Diffusion 1.5", - "description": "A powerful and modular Stable Diffusion GUI with a node-based interface.", - "category": ["Image Generation"], - "icon": "https://private-user-images.githubusercontent.com/75789136/253827723-a9445b86-a979-4467-be0b-750800e655a0.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzE1MTA1NTksIm5iZiI6MTczMTUxMDI1OSwicGF0aCI6Ii83NTc4OTEzNi8yNTM4Mjc3MjMtYTk0NDViODYtYTk3OS00NDY3LWJlMGItNzUwODAwZTY1NWEwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDExMTMlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQxMTEzVDE1MDQxOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTg4NDQ2MTU1ODU1NTMzMjg0MThhOTc4YTYwNTdjYWRiNDcwZjVkMTcxYWNjNjk3ODQ5NzUzOGUyYjVkMjA4ZWMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.VCLpIwvsIHD_gDZwATVKIyYHp0sfY6yIrpDLXfOdLDk" -} - -``` - -Contents of ComfyUI-stable-diffusion-1.5\job-definition.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "benchmark" - }, - "ops": [ - { - "type": "container/run", - "id": "comfy_stablediffusion", - "args": { - "cmd": [ - "/bin/sh", "-c", - "python -u main.py --listen --port 7860 --gpu-only" - ], - "image": "docker.io/nosana/sd-comfy-manager:0.0.1", - "gpu": true, - "expose": 7860, - "resources": [ - { - "type": "S3", - "url": "https://models.nosana.io/stable-diffusion/1.5", - "target": "/comfyui/models/checkpoints" - } - ] - } - } - ] -} - -``` - -Contents of ComfyUI-stable-diffusion-1.5\README.md: -``` -# ComfyUI Stable Diffusion - -![ComfyUI](https://raw.githubusercontent.com/nosana-ci/templates/main/templates/ComfyUI/comfyui.gif) - -ComfyUI is a powerful and modular Stable Diffusion GUI with a node-based interface, providing advanced control and flexibility for image generation. - -``` - -Contents of Forge-stable-diffusion-1.5\info.json: -``` -{ - "id": "forge-stable-diffusion", - "name": "Forge Stable Diffusion 1.5", - "description": "An optimized Stable Diffusion web UI with enhanced performance and features.", - "category": ["Image Generation"], - "icon": "https://private-user-images.githubusercontent.com/173618923/361423583-2dd6f478-e67a-4cc3-9b69-8a1c7728e06a.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzE1MTEwOTUsIm5iZiI6MTczMTUxMDc5NSwicGF0aCI6Ii8xNzM2MTg5MjMvMzYxNDIzNTgzLTJkZDZmNDc4LWU2N2EtNGNjMy05YjY5LThhMWM3NzI4ZTA2YS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQxMTEzJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MTExM1QxNTEzMTVaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1jY2JlNjg1MDUxM2I4YTZlYzg5MGQyMWE1Y2ViZjI1YTM1ZGViMTgwZDE4ZWY4ZWNmMjQyZDZlNDIyZGQ4NjFlJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.Ao9S1dPfnQPmzdlBJJjDJ1d0zN8mw8n1_Fp7d0F81pY" -} - -``` - -Contents of Forge-stable-diffusion-1.5\job-definition.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "forge_stablediffusion", - "args": { - "cmd": [ - "/bin/sh", "-c", - "python -u launch.py --api --listen --port 7861" - ], - "image": "docker.io/nosana/sd-forge-bench:1.0.0", - "gpu": true, - "expose": 7861, - "resources": [ - { - "type": "S3", - "url": "https://models.nosana.io/stable-diffusion/1.5", - "target": "/opt/stable-diffusion-webui-forge/models/Stable-diffusion" - } - ] - - } - } - ] -} -``` - -Contents of Forge-stable-diffusion-1.5\README.md: -``` -# Forge Stable Diffusion - -![Forge Stable Diffusion](https://raw.githubusercontent.com/nosana-ci/templates/main/templates/Forge-Stable-Diffusion/forge.gif) - -Forge Stable Diffusion is an optimized web UI for Stable Diffusion, offering enhanced performance and additional features for a superior image generation experience. - -``` - -Contents of Hello-world\info.json: -``` -{ - "id": "hello-world", - "name": "Hello World", - "description": "Echo hello world in a ubuntu docker container", - "category": ["Featured"], - "icon": "https://nosana.io/img/Nosana_Logomark_color.png" -} -``` - -Contents of Hello-world\job-definition.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "job-builder" - }, - "ops": [ - { - "type": "container/run", - "id": "hello-world", - "args": { - "cmd": "echo hello world", - "image": "ubuntu", - "gpu": true - } - } - ] -} -``` - -Contents of Hello-world\README.md: -``` -# Hello World Template - -This is a simple template that prints hello world with the 'ubuntu' docker image. - -``` - -Contents of InvokeAI\info.json: -``` -{ - "id": "invoke-ai", - "name": "Invoke AI", - "description": "Invoke is a leading creative engine built to empower professionals and enthusiasts alike. Generate and create stunning visual media using the latest AI-driven technologies.", - "category": ["Image Generation"], - "icon": "https://d4.alternativeto.net/xsSoWnh09YOroqDfDTYx-QcFdoXjOMcxLtDc7FZleA0/rs:fit:280:280:0/g:ce:0:0/exar:1/YWJzOi8vZGlzdC9pY29ucy9pbnZva2VhaV8yMjc0ODEucG5n.png" -} - -``` - -Contents of InvokeAI\invoke_ai.gif: -``` -[Could not decode file contents] - -``` - -Contents of InvokeAI\job-definition.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "benchmark" - }, - "ops": [ - { - "type": "container/run", - "id": "SD-invoke", - "args": { - "cmd": [ - "/bin/sh", - "-c", - "invokeai-web" - ], - "image": "docker.io/nosana/sd-invoke-bench:1.0.0", - "gpu": true, - "expose": 9090 - } - } - ] - } -``` - -Contents of InvokeAI\README.md: -``` -# Invoke AI - -![Invoke AI](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/InvokeAI/invoke_ai.gif) - -Invoke is a leading creative engine built to empower professionals and enthusiasts alike. Generate and create stunning visual media using the latest AI-driven technologies. Invoke offers an industry-leading web-based UI and serves as the foundation for multiple commercial products. - -Unleash your creativity with Nosana! Effortlessly run an Invoke AI instance to generate stunning images. Experience the power of advanced AI and GPU-backed nodes, making your image creation process smooth and efficient. Whether for personal projects or professional work, Nosana provides the tools you need to bring your artistic visions to life. - -``` - -Contents of Kohya-SS\info.json: -``` -{ - "id": "kohya-ss", - "name": "Kohya SS GUI", - "description": "A user-friendly web interface for training and fine-tuning Stable Diffusion models using Kohya SS scripts.", - "category": ["Model Fine-Tuning"], - "icon": "https://raw.githubusercontent.com/nosana-ci/templates/main/templates/Kohya-ss/kohya-ss.png" -} - -``` - -Contents of Kohya-SS\job-definition.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "kohya-ss-webservice", - "args": { - "image": "nosana/kohya_ss:1.0.0", - "cmd": ["python3", "kohya_gui.py", "--listen", "0.0.0.0", "--server_port", "7860", "--headless"], - "gpu": true, - "expose": 7860, - "env": { - "NVIDIA_VISIBLE_DEVICES": "all", - "NVIDIA_DRIVER_CAPABILITIES": "compute,utility" - } - } - } - ] -} - -``` - -Contents of Kohya-SS\README.md: -``` -# Kohya SS GUI - -![Kohya SS GUI](https://raw.githubusercontent.com/nosana-ci/templates/main/templates/Kohya-ss/kohya-ss.gif) - -Kohya SS GUI provides a user-friendly web interface for training and fine-tuning Stable Diffusion models using the Kohya SS scripts. It supports DreamBooth, LoRA, and fine-tuning, offering advanced features for efficient model training and customization. - -``` - -Contents of Nosana-RAG-bot-webui\info.json: -``` -{ - "id": "nosana-llm-rag-webui", - "name": "Nosana LLM RAG WebUI", - "description": "A powerful LLM RAG WebUI running on the LMDeploy framework with LLama3.1 70B quantized, optimized for high-end GPUs.", - "category": ["LLM"], - "icon": "https://nosana.io/img/Nosana_Logomark_color.png" -} - -``` - -Contents of Nosana-RAG-bot-webui\job-definition.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "nosana-chat-bot", - "args": { - "image": "docker.io/nosana/nosana-chat-bot:0.1.1", - "cmd": [ - "-c", - "lmdeploy serve api_server ./models/snapshots/2123003760781134cfc31124aa6560a45b491fdf --model-name llama3.1 --chat-template ./chat_template.json --model-format awq & npm start" - ], - "gpu": true, - "expose": 3000, - "resources": [ - { - "type": "S3", - "url": "s3://nos-ai-models-qllsn32u/hugging-face/llama3.1/70b/4x/models--hugging-quants--Meta-Llama-3.1-70B-Instruct-AWQ-INT4", - "target": "/app/models/" - } - ] - } - } - ] -} - -``` - -Contents of Nosana-RAG-bot-webui\nosana_bot.mp4: -``` -[Could not decode file contents] - -``` - -Contents of Nosana-RAG-bot-webui\README.md: -``` -# Nosana LLM RAG WebUI - -![Nosana LLM RAG WebUI](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Nosana-RAG-bot-webui/nosana_bot.mp4) - -Nosana LLM RAG WebUI is a robust interface built on the LMDeploy framework, utilizing the LLama3.1 70B quantized model. Designed for high-performance environments, it leverages NVIDIA A100, H100, or GPUs with at least 40GB VRAM to deliver exceptional AI-driven text generation and retrieval-augmented generation (RAG) capabilities. - -Unleash the full potential of advanced AI with Nosana! Effortlessly deploy and manage your LLM RAG WebUI instance on powerful GPU-backed nodes, ensuring seamless and efficient performance for your most demanding projects. - -Whether you're engaged in research, development, or deploying commercial solutions, Nosana provides the infrastructure and tools needed to harness the capabilities of Nosana LLM RAG WebUI effectively. - -``` - -Contents of Oobabooga\info.json: -``` -{ - "id": "oobabooga", - "name": "Oobabooga web UI", - "description": "Oobabooga is a versatile text generation web UI supporting multiple backends, offering rich features for generating and managing AI-driven text models.", - "category": ["LLM"], - "icon": "https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Oobabooga/oobabooga.png" -} - -``` - -Contents of Oobabooga\job-definition.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "Oobabooga-webui", - "args": { - "image": "docker.io/atinoda/text-generation-webui:latest", - "cmd": [], - "gpu": true, - "expose": 7860, - "env": { - "EXTRA_LAUNCH_ARGS": "--listen --verbose" - } - } - } - ] -} - -``` - -Contents of Oobabooga\oobabooga.gif: -``` -[Could not decode file contents] - -``` - -Contents of Oobabooga\oobabooga.mp4: -``` -[Could not decode file contents] - -``` - -Contents of Oobabooga\oobabooga.png: -``` -[Could not decode file contents] - -``` - -Contents of Oobabooga\README.md: -``` -# Oobabooga Text Generation WebUI - -![Oobabooga](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Oobabooga/oobabooga.gif) - -Oobabooga Text Generation WebUI is a powerful and flexible interface for generating text using various AI models. It supports multiple backends, including Transformers, llama.cpp, and ExLlamaV2, providing a seamless experience for both professionals and enthusiasts. - -Unleash your creativity with Nosana! Effortlessly run an Oobabooga instance to generate sophisticated text content. Experience the power of advanced AI and GPU-backed nodes, ensuring efficient and high-quality text generation for your projects. - -Whether for personal use, research, or professional applications, Nosana provides the tools you need to harness the full potential of Oobabooga's capabilities. - -``` - -Contents of Open-webui-ollama\info.json: -``` -{ - "id": "open-webui", - "name": "Open WebUI using Ollama", - "description": "Open WebUI supports various LLM models", - "category": ["LLM"], - "icon": "https://openwebui.com/user.png" -} -``` - -Contents of Open-webui-ollama\job-definition.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "job-builder" - }, - "ops": [ - { - "type": "container/run", - "id": "open-webui", - "args": { - "cmd": [], - "env": { - "WEBUI_AUTH": "False", - "WEBUI_NAME": "Nosana Chat" - }, - "image": "ghcr.io/open-webui/open-webui:ollama", - "gpu": true, - "expose": 8080 - } - } - ] -} -``` - -Contents of Open-webui-ollama\openwebui.gif: -``` -[Could not decode file contents] - -``` - -Contents of Open-webui-ollama\README.md: -``` -# Open WebUI - -![Open WebUI](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Open-webui-ollama/openwebui.gif) - -Open WebUI is an extensible, feature-rich, and user-friendly self-hosted WebUI designed to operate entirely offline. It supports various LLM runners, including Ollama and OpenAI-compatible APIs. With Nosana we can run an instance of Open WebUI and connect to it via a Nosana Endpoint. - -``` - -Contents of Pytorch-jupyter-notebook\info.json: -``` -{ - "id": "jupyter-notebook-pytorch", - "name": "Jupyter Notebook with pytorch:2.4.0-cuda12.1-cudnn9-runtime", - "description": "Jupyter Notebook Service", - "category": ["Featured"], - "icon": "https://seeklogo.com/images/J/jupyter-logo-A91705F539-seeklogo.com.png" -} -``` - -Contents of Pytorch-jupyter-notebook\job-definition.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "pytorch", - "args": { - "image": "docker.io/nosana/pytorch-jupyter:0.0.0", - "cmd": [ - "jupyter", - "notebook", - "--ip=0.0.0.0", - "--port=8888", - "--no-browser", - "--allow-root", - "--ServerApp.token=''", - "--ServerApp.password=''" - ], - "expose": 8888, - "gpu": true - } - } - ] -} - -``` - -Contents of Pytorch-jupyter-notebook\jupyter.gif: -``` -[Could not decode file contents] - -``` - -Contents of Pytorch-jupyter-notebook\README.md: -``` -# Jupyter Notebook Template - -![Jupyter Notebook](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Tensorflow-jupyter-notebook/jupyter.gif) - -Harness the power of Nosana Endpoint to seamlessly run Jupyter Notebooks and connect via a user-friendly web interface. With access to GPU-backed nodes, you can conduct your experiments efficiently and cost-effectively, unlocking new possibilities for your research and data analysis - -``` - -Contents of Rstudio\info.json: -``` -{ - "id": "rstudio", - "name": "RStudio", - "description": "Run RStudio Server in a Docker container, providing a powerful and consistent R development environment accessible through your browser.", - "category": ["Featured"], - "icon": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/R_logo.svg/1200px-R_logo.svg.png" -} - -``` - -Contents of Rstudio\job-definition.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "rocker-rstudio", - "args": { - "image": "rocker/rstudio:latest", - "cmd": [], - "gpu": true, - "expose": 8787, - "env": { - "USER": "rstudio", - "PASSWORD": "password", - "RUNROOTLESS": "false" - } - } - } - ] -} - -``` - -Contents of Rstudio\README.md: -``` -# RStudio - -![RStudio](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/rstudio/rstudio.mp4) - -RStudio Server allows you to run RStudio on a remote server and access it through your web browser. This setup provides a consistent and powerful R development environment accessible from anywhere, leveraging GPU-backed nodes for enhanced performance. - -**Key Features:** - -- **Remote Development:** Access your RStudio IDE from any device with a web browser. -- **Resource Efficiency:** Utilize powerful cloud servers to handle intensive computations and data processing. -- **Secure Access:** Configure user and group IDs, timezone, and secure access with passwords. -- **Scalable:** Deploy on GPU-backed nodes to accelerate your R workflows. -- **Easy Integration:** Seamlessly integrate with GitHub and other version control systems. - -**Unleash the power of R development with Nosana!** Effortlessly deploy and manage your RStudio Server instance on high-performance GPU-backed nodes, ensuring a smooth and efficient coding experience for your projects. - -Whether you're conducting data analysis, developing statistical models, or collaborating with a team, Nosana provides the infrastructure and tools you need to leverage RStudio effectively. - -## Getting Started - -1. **Deploy the Template:** - Use the Nosana platform to deploy the RStudio template. - -2. **Access the Web Interface:** - Navigate to `https://
` in your web browser to access the RStudio interface. - -3. **Configure RStudio:** - - **Username:** `rstudio` - - **Password:** Set via the `PASSWORD` environment variable in the job definition. - -## Configuration - -- **Environment Variables:** - - `USER=rstudio`: Sets the RStudio user. - - `PASSWORD=password`: Password for RStudio login. - - `RUNROOTLESS=false`: Run RStudio as root (set to `false` for security). - -- **Ports:** - - `8787`: Access the RStudio web interface. - -``` - -Contents of Tensorflow-jupyter-notebook\info.json: -``` -{ - "id": "jupyter-notebook-tensorflow", - "name": "Jupyter Notebook with Tensorflow", - "description": "Jupyter Notebook Service", - "category": ["Featured"], - "icon": "https://seeklogo.com/images/J/jupyter-logo-A91705F539-seeklogo.com.png" -} -``` - -Contents of Tensorflow-jupyter-notebook\job-definition.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "job-builder" - }, - "ops": [ - { - "type": "container/run", - "id": "jupyter-notebook", - "args": { - "cmd": "source /etc/bash.bashrc && jupyter notebook --notebook-dir=/tf --ip 0.0.0.0 --no-browser --allow-root --NotebookApp.token='' --NotebookApp.password=''", - "expose": 8888, - "image": "tensorflow/tensorflow:latest-gpu-jupyter", - "gpu": true - } - } - ] -} -``` - -Contents of Tensorflow-jupyter-notebook\jupyter.gif: -``` -[Could not decode file contents] - -``` - -Contents of Tensorflow-jupyter-notebook\README.md: -``` -# Jupyter Notebook Template - -![Jupyter Notebook](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Tensorflow-jupyter-notebook/jupyter.gif) - -Harness the power of Nosana Endpoint to seamlessly run Jupyter Notebooks and connect via a user-friendly web interface. With access to GPU-backed nodes, you can conduct your experiments efficiently and cost-effectively, unlocking new possibilities for your research and data analysis - -``` - -Contents of VScode-server\info.json: -``` -{ - "id": "vscode-server", - "name": "VSCode Server", - "description": "Run Visual Studio Code on a remote server accessible through your browser, enabling a consistent and powerful development environment.", - "category": ["Development", "IDE", "GPU", "Service", "Featured"], - "icon": "https://avatars.githubusercontent.com/u/12324908?s=280&v=4" -} - -``` - -Contents of VScode-server\job-definition.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "code-server", - "args": { - "image": "lscr.io/linuxserver/code-server:latest", - "cmd": [], - "gpu": true, - "expose": 8443, - "env": { - "PUID": "1000", - "PGID": "1000", - "TZ": "Etc/UTC", - "SUDO_PASSWORD": "password" - } - } - } - ] -} - -``` - -Contents of VScode-server\README.md: -``` -# VSCode Server - -![VSCode Server](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/vscode-server/vscode_server.mp4) - -VSCode Server allows you to run Visual Studio Code on a remote server and access it through your browser. This setup provides a consistent and powerful development environment accessible from anywhere, whether you're on a Chromebook, tablet, laptop, or desktop. - -**Key Features:** - -- **Remote Development:** Access your development environment from any device with a web browser. -- **Resource Efficiency:** Leverage powerful cloud servers to handle intensive computations, tests, compilations, and more. -- **Seamless Integration:** Easily integrate with GitHub by adding your SSH keys. -- **Customizable Environment:** Configure user and group IDs, timezone, and secure access with passwords. -- **Scalable:** Utilize GPU-backed nodes for enhanced performance when needed. - -**Unleash the power of remote development with Nosana!** Effortlessly deploy and manage your VSCode Server instance on high-performance GPU-backed nodes, ensuring a smooth and efficient coding experience for your projects. - -Whether you're developing software, managing repositories, or collaborating with a team, Nosana provides the infrastructure and tools you need to leverage VSCode Server effectively. - -## Getting Started - -1. **Deploy the Template:** - Use the Nosana platform to deploy the VSCode Server template. - -2. **Access the Web Interface:** - Navigate to `https://
` in your web browser to access the VSCode interface. - -3. **Configure GitHub Integration (Optional):** - - Add your SSH key to `/config/.ssh` for GitHub integration. - - Open a terminal within VSCode and set your GitHub username and email: - ```bash - git config --global user.name "your_username" - git config --global user.email "your_email@example.com" - ``` - -4. **Secure Your Instance:** - - Set a strong `SUDO_PASSWORD` in the environment variables to secure terminal access. - -## Configuration - -- **Environment Variables:** - - `PUID=1000`: User ID for file permissions. - - `PGID=1000`: Group ID for file permissions. - - `TZ=Etc/UTC`: Timezone setting. - - `SUDO_PASSWORD=password`: Password for sudo access in the terminal. - -- **Ports:** - - `8443`: Access the VSCode web interface. - -- **Volume Mappings:** - - `/config`: Contains all relevant configuration files and settings. - -## Notes - -- **GPU Requirements:** - - This container is configured to use GPU resources. Ensure your deployment node has a GPU with sufficient capabilities if needed. - -- **Security:** - - If `PASSWORD` or `HASHED_PASSWORD` is not set, there will be no authentication for the web interface. It's recommended to set at least one for security. - -- **Updating:** - - To update the container, pull the latest image and recreate the container using your deployment method (Docker Compose or Docker CLI). - ---- - -### **Directory Structure:** - -Ensure you create a new directory named `vscode-server` inside your `templates` directory. The structure should look like this: - - -``` - -Contents of Whisper-ASR-API\info.json: -``` -{ - "id": "whisper-asr-webservice", - "name": "Whisper ASR Webservice", - "description": "A robust speech recognition service powered by OpenAI's Whisper model, supporting multilingual transcription, translation, and language identification.", - "category": ["Featured"], - "icon": "https://www.datocms-assets.com/96965/1685731715-open-ai-stars-2x.png" -} - -``` - -Contents of Whisper-ASR-API\job-definition.json: -``` -{ - "version": "0.1", - "type": "container", - "meta": { - "trigger": "cli" - }, - "ops": [ - { - "type": "container/run", - "id": "openai-whisper-asr-webservice", - "args": { - "image": "docker.io/onerahmet/openai-whisper-asr-webservice:latest-gpu", - "cmd": [], - "gpu": true, - "expose": 9000, - "env": { - "ASR_MODEL": "base", - "ASR_ENGINE": "openai_whisper" - } - } - } - ] -} - -``` - -Contents of Whisper-ASR-API\README.md: -``` -# Whisper ASR Webservice - -![Whisper ASR Webservice](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/whisper-asr-webservice/whisper_asr_webservice.mp4) - -Whisper ASR Webservice is a powerful speech recognition API built on OpenAI's Whisper model. It supports multilingual speech recognition, translation, and language identification, making it ideal for a wide range of applications from transcription services to real-time translation tools. - -**Key Features:** - -- **Multilingual Support:** Transcribe and translate audio in multiple languages. -- **Flexible Deployment:** Easily run on GPU-backed nodes for enhanced performance. -- **API Integration:** Seamlessly integrate with existing applications using the OpenAI-compatible API. -- **Scalable:** Designed to handle varying workloads efficiently. - -**Unleash the power of advanced speech recognition with Nosana!** Effortlessly deploy and manage your Whisper ASR Webservice instance on high-performance GPU-backed nodes, ensuring accurate and efficient transcription for your projects. - -Whether you're developing a transcription service, building real-time translation tools, or integrating speech recognition into your applications, Nosana provides the infrastructure and tools you need to leverage Whisper ASR Webservice effectively. - -``` - From 10b461e76e81b9f434c089e1e3d8843de3b68d10 Mon Sep 17 00:00:00 2001 From: KeesGeerligs <166137421+KeesGeerligs@users.noreply.github.com> Date: Mon, 18 Nov 2024 09:10:17 +0100 Subject: [PATCH 5/5] Added some more templates --- .../README.md | 22 ++++-- .../info.json | 2 +- templates/Axolotl/README.md | 18 +++-- .../ComfyUI-stable-diffusion-1.5/README.md | 5 -- .../ComfyUI-stable-diffusion-1.5/info.json | 7 -- templates/ComfyUI/README.md | 19 ++++++ templates/ComfyUI/info.json | 7 ++ .../job-definition.json | 0 .../Forge-stable-diffusion-1.5/README.md | 18 ++++- .../Forge-stable-diffusion-1.5/info.json | 8 +-- templates/InvokeAI/README.md | 16 ++++- templates/InvokeAI/info.json | 2 +- templates/Kohya-SS/README.md | 18 ++++- templates/Kohya-SS/info.json | 2 +- templates/LMDeploy-API/README.md | 16 +++-- templates/LMDeploy-API/info.json | 2 +- templates/Llama-Factory/README.md | 20 +++++- templates/Llama-Factory/info.json | 8 ++- templates/Llama-Factory/job-definition.json | 24 ++++++- templates/Nosana-RAG-bot-webui/README.md | 16 ++++- templates/Nosana-RAG-bot-webui/info.json | 2 +- templates/Ollama-API/README.md | 20 +++++- templates/Ollama-API/info.json | 8 ++- templates/Ollama-API/job-definition.json | 20 +++++- .../Onetrainer-jupyter-notebook/README.md | 20 +++++- .../Onetrainer-jupyter-notebook/info.json | 8 ++- .../job-definition.json | 29 +++++++- templates/Oobabooga/README.md | 16 ++++- templates/Oobabooga/info.json | 2 +- templates/Pytorch-jupyter-notebook/README.md | 20 +++++- templates/Pytorch-jupyter-notebook/info.json | 2 +- templates/Rstudio/README.md | 45 ++++-------- templates/Rstudio/info.json | 2 +- templates/TGI-API/README.md | 16 ++++- templates/TGI-API/info.json | 8 ++- templates/TGI-API/job-definition.json | 25 ++++++- .../Tensorflow-jupyter-notebook/README.md | 20 +++++- .../Tensorflow-jupyter-notebook/info.json | 2 +- templates/Text-To-Speech-UI/README.md | 20 +++++- templates/Text-To-Speech-UI/info.json | 8 ++- .../Text-To-Speech-UI/job-definition.json | 20 +++++- templates/VLLM-API/README.md | 20 +++++- templates/VLLM-API/info.json | 8 ++- templates/VLLM-API/job-definition.json | 25 ++++++- templates/VScode-server/README.md | 68 +++---------------- templates/VScode-server/info.json | 2 +- templates/Whisper-ASR-API/README.md | 23 ++++--- templates/Whisper-ASR-API/info.json | 2 +- templates/open-webui-ollama/README.md | 18 ++++- templates/open-webui-ollama/info.json | 2 +- 50 files changed, 530 insertions(+), 181 deletions(-) delete mode 100644 templates/ComfyUI-stable-diffusion-1.5/README.md delete mode 100644 templates/ComfyUI-stable-diffusion-1.5/info.json create mode 100644 templates/ComfyUI/README.md create mode 100644 templates/ComfyUI/info.json rename templates/{ComfyUI-stable-diffusion-1.5 => ComfyUI}/job-definition.json (100%) diff --git a/templates/AUTOMATIC1111-stable-diffusion-1.5/README.md b/templates/AUTOMATIC1111-stable-diffusion-1.5/README.md index 65f4242..a11f62e 100644 --- a/templates/AUTOMATIC1111-stable-diffusion-1.5/README.md +++ b/templates/AUTOMATIC1111-stable-diffusion-1.5/README.md @@ -1,10 +1,20 @@ -# Stable Diffusion WebUI +# AUTOMATIC1111 Stable Diffusion -![Stable Diffusion WebUI](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/AUTOMATIC1111-stable-diffusion/stable_diff.gif) +![AUTOMATIC1111](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/AUTOMATIC1111-stable-diffusion/stable_diff.gif) -[Stable Diffusion WebUI](https://github.com/AUTOMATIC1111/stable-diffusion-webui) is a web interface for Stable Diffusion, implemented using Gradio library. +A powerful web interface for Stable Diffusion, offering extensive features for AI image generation and editing. -Unleash your creativity with Nosana! Effortlessly run a Stable Diffusion instance to generate stunning images. -Experience the power of advanced AI and GPU-backed nodes, making your image creation process smooth and efficient. -Whether for personal projects or professional work, Nosana provides the tools you need to bring your artistic visions to life. +Unleash the power of Stable Diffusion with Nosana! Effortlessly run your instance on high-performance GPU-backed nodes, ensuring optimal image generation for your creative projects. + +## Key Features +- Text-to-image generation +- Image-to-image editing +- Inpainting and outpainting +- Custom model support +- GPU acceleration support + +## Configuration +- Port: 7860 +- GPU: Required +- Model: Stable Diffusion 1.5 diff --git a/templates/AUTOMATIC1111-stable-diffusion-1.5/info.json b/templates/AUTOMATIC1111-stable-diffusion-1.5/info.json index d42f126..4554f86 100644 --- a/templates/AUTOMATIC1111-stable-diffusion-1.5/info.json +++ b/templates/AUTOMATIC1111-stable-diffusion-1.5/info.json @@ -2,6 +2,6 @@ "id": "AUTOMTIC1111-stable-diffusion", "name": "AUTOMATIC1111 Stable Diffusion 1.5", "description": "Stable Diffusion is a latent text-to-image diffusion model", - "category": ["Image Generation"], + "category": ["Web UI", "Image Generation"], "icon": "https://private-user-images.githubusercontent.com/173618923/361423663-9ebdd0cf-02e2-497d-b87b-f98555396d23.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzE1MTEwOTUsIm5iZiI6MTczMTUxMDc5NSwicGF0aCI6Ii8xNzM2MTg5MjMvMzYxNDIzNjYzLTllYmRkMGNmLTAyZTItNDk3ZC1iODdiLWY5ODU1NTM5NmQyMy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQxMTEzJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MTExM1QxNTEzMTVaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1kNDI5MzVkM2I4NGY1NDViNzEzZDE5ZjYxNzJmYjdmOTM0MWU0OGI4OTg4OTgyZGY3NTUyZGQwODIwNzQzOGU2JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.o4AIHOfkVEEw-Su4HTmAQIzBvnxjcOB1BUiUDzUSZrs" } \ No newline at end of file diff --git a/templates/Axolotl/README.md b/templates/Axolotl/README.md index b315bb8..d66301d 100644 --- a/templates/Axolotl/README.md +++ b/templates/Axolotl/README.md @@ -1,9 +1,19 @@ -# Axolotl +# Axolotl LLM Fine-tuning ![Axolotl](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Axolotl/axolotl.mp4) -Axolotl is a powerful tool designed to streamline the fine-tuning of various AI models, offering support for multiple configurations and architectures. It enables efficient training with single or multiple GPUs, making it ideal for both personal and professional projects. +A streamlined environment for fine-tuning Large Language Models with multiple training configurations. -Unleash your potential with Nosana! Effortlessly run an Axolotl instance to fine-tune your AI models with ease. Experience the flexibility and power of advanced AI and GPU-backed nodes, ensuring your model training processes are smooth and effective. +Unleash the power of model fine-tuning with Nosana! Effortlessly run your Axolotl environment on high-performance GPU-backed nodes, ensuring optimal training for your custom models. -Whether you're conducting research, developing applications, or exploring AI capabilities, Nosana provides the essential tools to leverage Axolotl's full potential. +## Key Features +- Multiple training methods +- Configuration flexibility +- Experiment tracking +- Jupyter interface +- GPU acceleration support + +## Configuration +- Port: 8888 +- GPU: Required +- No authentication required diff --git a/templates/ComfyUI-stable-diffusion-1.5/README.md b/templates/ComfyUI-stable-diffusion-1.5/README.md deleted file mode 100644 index 95b372c..0000000 --- a/templates/ComfyUI-stable-diffusion-1.5/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# ComfyUI Stable Diffusion - -![ComfyUI](https://raw.githubusercontent.com/nosana-ci/templates/main/templates/ComfyUI/comfyui.gif) - -ComfyUI is a powerful and modular Stable Diffusion GUI with a node-based interface, providing advanced control and flexibility for image generation. diff --git a/templates/ComfyUI-stable-diffusion-1.5/info.json b/templates/ComfyUI-stable-diffusion-1.5/info.json deleted file mode 100644 index 1b90132..0000000 --- a/templates/ComfyUI-stable-diffusion-1.5/info.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "id": "comfyui-stable-diffusion", - "name": "ComfyUI Stable Diffusion 1.5", - "description": "A powerful and modular Stable Diffusion GUI with a node-based interface.", - "category": ["Image Generation"], - "icon": "https://private-user-images.githubusercontent.com/75789136/253827723-a9445b86-a979-4467-be0b-750800e655a0.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzE1MTA1NTksIm5iZiI6MTczMTUxMDI1OSwicGF0aCI6Ii83NTc4OTEzNi8yNTM4Mjc3MjMtYTk0NDViODYtYTk3OS00NDY3LWJlMGItNzUwODAwZTY1NWEwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDExMTMlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQxMTEzVDE1MDQxOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTg4NDQ2MTU1ODU1NTMzMjg0MThhOTc4YTYwNTdjYWRiNDcwZjVkMTcxYWNjNjk3ODQ5NzUzOGUyYjVkMjA4ZWMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.VCLpIwvsIHD_gDZwATVKIyYHp0sfY6yIrpDLXfOdLDk" -} diff --git a/templates/ComfyUI/README.md b/templates/ComfyUI/README.md new file mode 100644 index 0000000..4d673bf --- /dev/null +++ b/templates/ComfyUI/README.md @@ -0,0 +1,19 @@ +# ComfyUI + +![ComfyUI](https://raw.githubusercontent.com/nosana-ci/templates/main/templates/ComfyUI/comfyui.gif) + +A node-based interface for image generation with advanced workflow capabilities. + +Unleash the power of visual AI workflows with Nosana! Effortlessly run your ComfyUI instance on high-performance GPU-backed nodes, ensuring optimal performance for your image generation pipelines. + +## Key Features +- Node-based workflow +- Custom node creation +- Pipeline automation +- Advanced queue system +- GPU acceleration support + +## Configuration +- Port: 8188 +- GPU: Required +- Model: Stable Diffusion diff --git a/templates/ComfyUI/info.json b/templates/ComfyUI/info.json new file mode 100644 index 0000000..a3f2018 --- /dev/null +++ b/templates/ComfyUI/info.json @@ -0,0 +1,7 @@ +{ + "id": "comfyui", + "name": "ComfyUI", + "description": "A powerful and modular image generation interface with a node-based workflow editor", + "category": ["Web UI", "Image Generation"], + "icon": "https://raw.githubusercontent.com/comfyanonymous/ComfyUI/master/web/favicon.ico" +} diff --git a/templates/ComfyUI-stable-diffusion-1.5/job-definition.json b/templates/ComfyUI/job-definition.json similarity index 100% rename from templates/ComfyUI-stable-diffusion-1.5/job-definition.json rename to templates/ComfyUI/job-definition.json diff --git a/templates/Forge-stable-diffusion-1.5/README.md b/templates/Forge-stable-diffusion-1.5/README.md index fe1288b..9419bbd 100644 --- a/templates/Forge-stable-diffusion-1.5/README.md +++ b/templates/Forge-stable-diffusion-1.5/README.md @@ -1,5 +1,19 @@ # Forge Stable Diffusion -![Forge Stable Diffusion](https://raw.githubusercontent.com/nosana-ci/templates/main/templates/Forge-Stable-Diffusion/forge.gif) +![Forge](https://raw.githubusercontent.com/nosana-ci/templates/main/templates/Forge-Stable-Diffusion/forge.gif) -Forge Stable Diffusion is an optimized web UI for Stable Diffusion, offering enhanced performance and additional features for a superior image generation experience. +An optimized fork of AUTOMATIC1111's Stable Diffusion web UI with enhanced features. + +Unleash the power of optimized image generation with Nosana! Effortlessly run your Forge instance on high-performance GPU-backed nodes, ensuring optimal performance for your creative projects. + +## Key Features +- Enhanced performance +- Advanced UI features +- Custom model support +- API integration +- GPU acceleration support + +## Configuration +- Port: 7861 +- GPU: Required +- Model: Stable Diffusion 1.5 diff --git a/templates/Forge-stable-diffusion-1.5/info.json b/templates/Forge-stable-diffusion-1.5/info.json index 07f41ef..086a0f2 100644 --- a/templates/Forge-stable-diffusion-1.5/info.json +++ b/templates/Forge-stable-diffusion-1.5/info.json @@ -1,7 +1,7 @@ { "id": "forge-stable-diffusion", - "name": "Forge Stable Diffusion 1.5", - "description": "An optimized Stable Diffusion web UI with enhanced performance and features.", - "category": ["Image Generation"], - "icon": "https://private-user-images.githubusercontent.com/173618923/361423583-2dd6f478-e67a-4cc3-9b69-8a1c7728e06a.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzE1MTEwOTUsIm5iZiI6MTczMTUxMDc5NSwicGF0aCI6Ii8xNzM2MTg5MjMvMzYxNDIzNTgzLTJkZDZmNDc4LWU2N2EtNGNjMy05YjY5LThhMWM3NzI4ZTA2YS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQxMTEzJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MTExM1QxNTEzMTVaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1jY2JlNjg1MDUxM2I4YTZlYzg5MGQyMWE1Y2ViZjI1YTM1ZGViMTgwZDE4ZWY4ZWNmMjQyZDZlNDIyZGQ4NjFlJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.Ao9S1dPfnQPmzdlBJJjDJ1d0zN8mw8n1_Fp7d0F81pY" + "name": "Forge Stable Diffusion", + "description": "A fork of AUTOMATIC1111's Stable Diffusion web UI with additional features and optimizations", + "category": ["Web UI", "Image Generation"], + "icon": "https://raw.githubusercontent.com/lllyasviel/stable-diffusion-webui-forge/master/favicon.ico" } diff --git a/templates/InvokeAI/README.md b/templates/InvokeAI/README.md index fbe4869..0f2114c 100644 --- a/templates/InvokeAI/README.md +++ b/templates/InvokeAI/README.md @@ -2,6 +2,18 @@ ![Invoke AI](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/InvokeAI/invoke_ai.gif) -Invoke is a leading creative engine built to empower professionals and enthusiasts alike. Generate and create stunning visual media using the latest AI-driven technologies. Invoke offers an industry-leading web-based UI and serves as the foundation for multiple commercial products. +A powerful creative engine for AI-driven image generation and editing. -Unleash your creativity with Nosana! Effortlessly run an Invoke AI instance to generate stunning images. Experience the power of advanced AI and GPU-backed nodes, making your image creation process smooth and efficient. Whether for personal projects or professional work, Nosana provides the tools you need to bring your artistic visions to life. +Unleash the power of creative AI with Nosana! Effortlessly run your Invoke AI instance on high-performance GPU-backed nodes, ensuring optimal performance for your artistic projects. + +## Key Features +- Text-to-image generation +- Image editing tools +- Workflow automation +- Custom model support +- GPU acceleration support + +## Configuration +- Port: 7860 +- GPU: Required +- Model: Stable Diffusion diff --git a/templates/InvokeAI/info.json b/templates/InvokeAI/info.json index 2be4474..138598d 100644 --- a/templates/InvokeAI/info.json +++ b/templates/InvokeAI/info.json @@ -2,6 +2,6 @@ "id": "invoke-ai", "name": "Invoke AI", "description": "Invoke is a leading creative engine built to empower professionals and enthusiasts alike. Generate and create stunning visual media using the latest AI-driven technologies.", - "category": ["Image Generation"], + "category": ["Web UI", "Image Generation"], "icon": "https://d4.alternativeto.net/xsSoWnh09YOroqDfDTYx-QcFdoXjOMcxLtDc7FZleA0/rs:fit:280:280:0/g:ce:0:0/exar:1/YWJzOi8vZGlzdC9pY29ucy9pbnZva2VhaV8yMjc0ODEucG5n.png" } diff --git a/templates/Kohya-SS/README.md b/templates/Kohya-SS/README.md index 68a9ba9..5524024 100644 --- a/templates/Kohya-SS/README.md +++ b/templates/Kohya-SS/README.md @@ -1,5 +1,19 @@ # Kohya SS GUI -![Kohya SS GUI](https://raw.githubusercontent.com/nosana-ci/templates/main/templates/Kohya-ss/kohya-ss.gif) +![Kohya SS](https://raw.githubusercontent.com/nosana-ci/templates/main/templates/Kohya-ss/kohya-ss.gif) -Kohya SS GUI provides a user-friendly web interface for training and fine-tuning Stable Diffusion models using the Kohya SS scripts. It supports DreamBooth, LoRA, and fine-tuning, offering advanced features for efficient model training and customization. +A user-friendly interface for training and fine-tuning Stable Diffusion models. + +Unleash the power of model training with Nosana! Effortlessly run your Kohya SS instance on high-performance GPU-backed nodes, ensuring optimal training for your custom models. + +## Key Features +- Custom model training +- LoRA support +- Hyperparameter optimization +- Dataset management +- GPU acceleration support + +## Configuration +- Port: 7860 +- GPU: Required +- Headless mode enabled diff --git a/templates/Kohya-SS/info.json b/templates/Kohya-SS/info.json index 56b9da1..f4526ce 100644 --- a/templates/Kohya-SS/info.json +++ b/templates/Kohya-SS/info.json @@ -2,6 +2,6 @@ "id": "kohya-ss", "name": "Kohya SS GUI", "description": "A user-friendly web interface for training and fine-tuning Stable Diffusion models using Kohya SS scripts.", - "category": ["Model Fine-Tuning"], + "category": ["Web UI", "Image Generation Fine-tuning"], "icon": "https://raw.githubusercontent.com/nosana-ci/templates/main/templates/Kohya-ss/kohya-ss.png" } diff --git a/templates/LMDeploy-API/README.md b/templates/LMDeploy-API/README.md index bb0e7d5..be89057 100644 --- a/templates/LMDeploy-API/README.md +++ b/templates/LMDeploy-API/README.md @@ -1,15 +1,19 @@ # LMDeploy API -LMDeploy is a high-performance inference engine for Large Language Models (LLMs). It provides quantization, optimization, and serving capabilities to efficiently deploy LLMs in production environments. +![LMDeploy](link-to-image) + +A high-performance inference engine for Large Language Models with advanced optimization features. + +Unleash the power of LLMs with Nosana! Effortlessly deploy your models on high-performance GPU-backed nodes, ensuring optimal inference speed for your applications. ## Key Features -- Optimized inference engine for LLMs -- Support for various model architectures -- Built-in quantization capabilities +- Optimized model inference +- Quantization support - RESTful API interface +- Multi-model serving - GPU acceleration support ## Configuration - Port: 23333 -- Model: Qwen2.5-7B -- GPU: Required \ No newline at end of file +- GPU: Required +- Model: Qwen2.5-7B \ No newline at end of file diff --git a/templates/LMDeploy-API/info.json b/templates/LMDeploy-API/info.json index 42530da..401d62e 100644 --- a/templates/LMDeploy-API/info.json +++ b/templates/LMDeploy-API/info.json @@ -2,6 +2,6 @@ "id": "lmdeploy-api", "name": "LMDeploy API", "description": "A high-performance inference engine for LLMs with quantization and optimization features", - "category": ["LLM", "API"], + "category": ["API Only", "LLM"], "icon": "https://raw.githubusercontent.com/InternLM/lmdeploy/main/docs/en/_static/image/lmdeploy-logo.png" } \ No newline at end of file diff --git a/templates/Llama-Factory/README.md b/templates/Llama-Factory/README.md index 0519ecb..0501dbd 100644 --- a/templates/Llama-Factory/README.md +++ b/templates/Llama-Factory/README.md @@ -1 +1,19 @@ - \ No newline at end of file +# Llama Factory + +![Llama Factory](link-to-image) + +A unified framework for fine-tuning Large Language Models with various training methods. + +Unleash the power of model fine-tuning with Nosana! Effortlessly run your Llama Factory instance on high-performance GPU-backed nodes, ensuring optimal training for your models. + +## Key Features +- Multiple training methods +- Pre-built training templates +- Model architecture support +- Progress monitoring +- GPU acceleration support + +## Configuration +- Port: 7860 +- GPU: Required +- WebUI access for training \ No newline at end of file diff --git a/templates/Llama-Factory/info.json b/templates/Llama-Factory/info.json index 0519ecb..989cee3 100644 --- a/templates/Llama-Factory/info.json +++ b/templates/Llama-Factory/info.json @@ -1 +1,7 @@ - \ No newline at end of file +{ + "id": "llama-factory", + "name": "Llama Factory", + "description": "A unified framework for fine-tuning LLMs, supporting various architectures and training methods", + "category": ["Web UI", "LLM Fine-tuning"], + "icon": "https://raw.githubusercontent.com/hiyouga/LLaMA-Factory/main/assets/logo.png" +} \ No newline at end of file diff --git a/templates/Llama-Factory/job-definition.json b/templates/Llama-Factory/job-definition.json index 0519ecb..7f60ea4 100644 --- a/templates/Llama-Factory/job-definition.json +++ b/templates/Llama-Factory/job-definition.json @@ -1 +1,23 @@ - \ No newline at end of file +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "llama-factory", + "args": { + "image": "docker.io/nosana/llama-factory:0.0.0", + "cmd": [ + "/bin/sh", + "-c", + "llamafactory-cli webui" + ], + "gpu": true, + "expose": 7860 + } + } + ] +} \ No newline at end of file diff --git a/templates/Nosana-RAG-bot-webui/README.md b/templates/Nosana-RAG-bot-webui/README.md index 6ad6d80..a6bb134 100644 --- a/templates/Nosana-RAG-bot-webui/README.md +++ b/templates/Nosana-RAG-bot-webui/README.md @@ -2,8 +2,18 @@ ![Nosana LLM RAG WebUI](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Nosana-RAG-bot-webui/nosana_bot.mp4) -Nosana LLM RAG WebUI is a robust interface built on the LMDeploy framework, utilizing the LLama3.1 70B quantized model. Designed for high-performance environments, it leverages NVIDIA A100, H100, or GPUs with at least 40GB VRAM to deliver exceptional AI-driven text generation and retrieval-augmented generation (RAG) capabilities. +A powerful RAG-enabled chat interface built on LMDeploy framework with LLama3.1 70B quantized. -Unleash the full potential of advanced AI with Nosana! Effortlessly deploy and manage your LLM RAG WebUI instance on powerful GPU-backed nodes, ensuring seamless and efficient performance for your most demanding projects. +Unleash the power of RAG-enhanced LLMs with Nosana! Effortlessly run your chat interface on high-performance GPU-backed nodes, ensuring optimal performance for your conversational AI applications. -Whether you're engaged in research, development, or deploying commercial solutions, Nosana provides the infrastructure and tools needed to harness the capabilities of Nosana LLM RAG WebUI effectively. +## Key Features +- RAG capabilities +- Chat interface +- Document processing +- Knowledge base integration +- GPU acceleration support + +## Configuration +- Port: 3000 +- GPU: Required (40GB+ VRAM) +- Model: LLama3.1 70B quantized diff --git a/templates/Nosana-RAG-bot-webui/info.json b/templates/Nosana-RAG-bot-webui/info.json index 76a589b..60d53cb 100644 --- a/templates/Nosana-RAG-bot-webui/info.json +++ b/templates/Nosana-RAG-bot-webui/info.json @@ -2,6 +2,6 @@ "id": "nosana-llm-rag-webui", "name": "Nosana LLM RAG WebUI", "description": "A powerful LLM RAG WebUI running on the LMDeploy framework with LLama3.1 70B quantized, optimized for high-end GPUs.", - "category": ["LLM"], + "category": ["Web UI", "Featured"], "icon": "https://nosana.io/img/Nosana_Logomark_color.png" } diff --git a/templates/Ollama-API/README.md b/templates/Ollama-API/README.md index 0519ecb..e875237 100644 --- a/templates/Ollama-API/README.md +++ b/templates/Ollama-API/README.md @@ -1 +1,19 @@ - \ No newline at end of file +# Ollama API + +![Ollama](link-to-image) + +A lightweight API service for running Large Language Models locally. + +Unleash the power of local LLMs with Nosana! Effortlessly run your Ollama API instance on high-performance GPU-backed nodes, ensuring optimal inference for your applications. + +## Key Features +- Multiple model support +- RESTful API +- Low resource usage +- Easy model management +- GPU acceleration support + +## Configuration +- Port: 11434 +- GPU: Required +- API endpoint access \ No newline at end of file diff --git a/templates/Ollama-API/info.json b/templates/Ollama-API/info.json index 0519ecb..999f7e3 100644 --- a/templates/Ollama-API/info.json +++ b/templates/Ollama-API/info.json @@ -1 +1,7 @@ - \ No newline at end of file +{ + "id": "ollama-api", + "name": "Ollama API", + "description": "Run large language models locally with a simple API interface", + "category": ["API Only", "LLM"], + "icon": "https://ollama.ai/public/ollama.png" +} \ No newline at end of file diff --git a/templates/Ollama-API/job-definition.json b/templates/Ollama-API/job-definition.json index 0519ecb..5583fc6 100644 --- a/templates/Ollama-API/job-definition.json +++ b/templates/Ollama-API/job-definition.json @@ -1 +1,19 @@ - \ No newline at end of file +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "ollama-service", + "args": { + "image": "docker.io/ollama/ollama", + "cmd": [], + "gpu": true, + "expose": 11434 + } + } + ] +} \ No newline at end of file diff --git a/templates/Onetrainer-jupyter-notebook/README.md b/templates/Onetrainer-jupyter-notebook/README.md index 0519ecb..edd0713 100644 --- a/templates/Onetrainer-jupyter-notebook/README.md +++ b/templates/Onetrainer-jupyter-notebook/README.md @@ -1 +1,19 @@ - \ No newline at end of file +# Onetrainer Jupyter Notebook + +![Onetrainer](link-to-image) + +A comprehensive Jupyter environment for AI model training with the Onetrainer framework. + +Unleash the power of model training with Nosana! Effortlessly run your Onetrainer environment on high-performance GPU-backed nodes, ensuring optimal performance for your training workflows. + +## Key Features +- Interactive development +- Pre-configured frameworks +- Training templates +- Experiment tracking +- GPU acceleration support + +## Configuration +- Port: 8888 +- GPU: Required +- No authentication required \ No newline at end of file diff --git a/templates/Onetrainer-jupyter-notebook/info.json b/templates/Onetrainer-jupyter-notebook/info.json index 0519ecb..7eba8eb 100644 --- a/templates/Onetrainer-jupyter-notebook/info.json +++ b/templates/Onetrainer-jupyter-notebook/info.json @@ -1 +1,7 @@ - \ No newline at end of file +{ + "id": "onetrainer-jupyter", + "name": "Onetrainer Jupyter Notebook", + "description": "A comprehensive Jupyter environment for AI model training with Onetrainer framework", + "category": ["Web UI", "Image Generation Fine-tuning"], + "icon": "https://seeklogo.com/images/J/jupyter-logo-A91705F539-seeklogo.com.png" +} \ No newline at end of file diff --git a/templates/Onetrainer-jupyter-notebook/job-definition.json b/templates/Onetrainer-jupyter-notebook/job-definition.json index 0519ecb..ed1414b 100644 --- a/templates/Onetrainer-jupyter-notebook/job-definition.json +++ b/templates/Onetrainer-jupyter-notebook/job-definition.json @@ -1 +1,28 @@ - \ No newline at end of file +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "Onetrainer-UI", + "args": { + "image": "nosana/onetrainercomplete:0.0.0", + "cmd": [ + "jupyter", + "notebook", + "--ip=0.0.0.0", + "--port=8888", + "--no-browser", + "--allow-root", + "--ServerApp.token=''", + "--ServerApp.password=''" + ], + "expose": 8888, + "gpu": true + } + } + ] +} \ No newline at end of file diff --git a/templates/Oobabooga/README.md b/templates/Oobabooga/README.md index 2ce8530..b1c3d1f 100644 --- a/templates/Oobabooga/README.md +++ b/templates/Oobabooga/README.md @@ -2,8 +2,18 @@ ![Oobabooga](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Oobabooga/oobabooga.gif) -Oobabooga Text Generation WebUI is a powerful and flexible interface for generating text using various AI models. It supports multiple backends, including Transformers, llama.cpp, and ExLlamaV2, providing a seamless experience for both professionals and enthusiasts. +A versatile text generation interface supporting multiple LLM backends and models. -Unleash your creativity with Nosana! Effortlessly run an Oobabooga instance to generate sophisticated text content. Experience the power of advanced AI and GPU-backed nodes, ensuring efficient and high-quality text generation for your projects. +Unleash the power of text generation with Nosana! Effortlessly run your Oobabooga instance on high-performance GPU-backed nodes, ensuring optimal performance for your language tasks. -Whether for personal use, research, or professional applications, Nosana provides the tools you need to harness the full potential of Oobabooga's capabilities. +## Key Features +- Multiple model support +- Interactive chat interface +- Custom prompt templates +- Model fine-tuning options +- GPU acceleration support + +## Configuration +- Port: 7860 +- GPU: Required +- Launch Arguments: --listen --verbose diff --git a/templates/Oobabooga/info.json b/templates/Oobabooga/info.json index b0bf475..355e995 100644 --- a/templates/Oobabooga/info.json +++ b/templates/Oobabooga/info.json @@ -2,6 +2,6 @@ "id": "oobabooga", "name": "Oobabooga web UI", "description": "Oobabooga is a versatile text generation web UI supporting multiple backends, offering rich features for generating and managing AI-driven text models.", - "category": ["LLM"], + "category": ["Web UI", "LLM"], "icon": "https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Oobabooga/oobabooga.png" } diff --git a/templates/Pytorch-jupyter-notebook/README.md b/templates/Pytorch-jupyter-notebook/README.md index da329f5..8f850c3 100644 --- a/templates/Pytorch-jupyter-notebook/README.md +++ b/templates/Pytorch-jupyter-notebook/README.md @@ -1,5 +1,19 @@ -# Jupyter Notebook Template +# PyTorch Jupyter Notebook -![Jupyter Notebook](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Tensorflow-jupyter-notebook/jupyter.gif) +![PyTorch Jupyter](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Pytorch-jupyter-notebook/jupyter.gif) -Harness the power of Nosana Endpoint to seamlessly run Jupyter Notebooks and connect via a user-friendly web interface. With access to GPU-backed nodes, you can conduct your experiments efficiently and cost-effectively, unlocking new possibilities for your research and data analysis +A Jupyter Notebook environment with PyTorch pre-installed for deep learning development. + +Unleash the power of PyTorch with Nosana! Effortlessly run your Jupyter environment on high-performance GPU-backed nodes, ensuring optimal performance for your deep learning projects. + +## Key Features +- Interactive Python environment +- Pre-installed PyTorch +- CUDA support +- Notebook sharing +- GPU acceleration support + +## Configuration +- Port: 8888 +- GPU: Required +- No authentication required diff --git a/templates/Pytorch-jupyter-notebook/info.json b/templates/Pytorch-jupyter-notebook/info.json index 4797be5..f41700e 100644 --- a/templates/Pytorch-jupyter-notebook/info.json +++ b/templates/Pytorch-jupyter-notebook/info.json @@ -2,6 +2,6 @@ "id": "jupyter-notebook-pytorch", "name": "Jupyter Notebook with pytorch:2.4.0-cuda12.1-cudnn9-runtime", "description": "Jupyter Notebook Service", - "category": ["Featured"], + "category": ["Web UI", "Featured"], "icon": "https://seeklogo.com/images/J/jupyter-logo-A91705F539-seeklogo.com.png" } \ No newline at end of file diff --git a/templates/Rstudio/README.md b/templates/Rstudio/README.md index faaa8aa..7043df6 100644 --- a/templates/Rstudio/README.md +++ b/templates/Rstudio/README.md @@ -1,39 +1,20 @@ -# RStudio +# RStudio Server ![RStudio](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/rstudio/rstudio.mp4) -RStudio Server allows you to run RStudio on a remote server and access it through your web browser. This setup provides a consistent and powerful R development environment accessible from anywhere, leveraging GPU-backed nodes for enhanced performance. +A professional development environment for R programming accessible through your web browser. -**Key Features:** +Unleash the power of R development with Nosana! Effortlessly run your RStudio instance on high-performance GPU-backed nodes, ensuring optimal performance for your data science projects. -- **Remote Development:** Access your RStudio IDE from any device with a web browser. -- **Resource Efficiency:** Utilize powerful cloud servers to handle intensive computations and data processing. -- **Secure Access:** Configure user and group IDs, timezone, and secure access with passwords. -- **Scalable:** Deploy on GPU-backed nodes to accelerate your R workflows. -- **Easy Integration:** Seamlessly integrate with GitHub and other version control systems. - -**Unleash the power of R development with Nosana!** Effortlessly deploy and manage your RStudio Server instance on high-performance GPU-backed nodes, ensuring a smooth and efficient coding experience for your projects. - -Whether you're conducting data analysis, developing statistical models, or collaborating with a team, Nosana provides the infrastructure and tools you need to leverage RStudio effectively. - -## Getting Started - -1. **Deploy the Template:** - Use the Nosana platform to deploy the RStudio template. - -2. **Access the Web Interface:** - Navigate to `https://
` in your web browser to access the RStudio interface. - -3. **Configure RStudio:** - - **Username:** `rstudio` - - **Password:** Set via the `PASSWORD` environment variable in the job definition. +## Key Features +- Interactive R environment +- Package management +- Data visualization tools +- Project organization +- GPU acceleration support ## Configuration - -- **Environment Variables:** - - `USER=rstudio`: Sets the RStudio user. - - `PASSWORD=password`: Password for RStudio login. - - `RUNROOTLESS=false`: Run RStudio as root (set to `false` for security). - -- **Ports:** - - `8787`: Access the RStudio web interface. +- Port: 8787 +- GPU: Required +- Username: rstudio +- Password: Configurable via environment diff --git a/templates/Rstudio/info.json b/templates/Rstudio/info.json index 9d54ccf..f344f63 100644 --- a/templates/Rstudio/info.json +++ b/templates/Rstudio/info.json @@ -2,6 +2,6 @@ "id": "rstudio", "name": "RStudio", "description": "Run RStudio Server in a Docker container, providing a powerful and consistent R development environment accessible through your browser.", - "category": ["Featured"], + "category": ["Web UI", "Featured"], "icon": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/R_logo.svg/1200px-R_logo.svg.png" } diff --git a/templates/TGI-API/README.md b/templates/TGI-API/README.md index 0519ecb..3a1467e 100644 --- a/templates/TGI-API/README.md +++ b/templates/TGI-API/README.md @@ -1 +1,15 @@ - \ No newline at end of file +# Text Generation Inference (TGI) API + +Text Generation Inference is Hugging Face's optimized text generation service, designed for production environments. + +## Key Features +- Optimized inference for text generation models +- Support for various model architectures +- Built-in batching and caching +- RESTful API interface +- GPU acceleration + +## Configuration +- Port: 8080 +- Model: Qwen2.5-7B +- GPU: Required \ No newline at end of file diff --git a/templates/TGI-API/info.json b/templates/TGI-API/info.json index 0519ecb..68437ca 100644 --- a/templates/TGI-API/info.json +++ b/templates/TGI-API/info.json @@ -1 +1,7 @@ - \ No newline at end of file +{ + "id": "tgi-api", + "name": "Text Generation Inference API", + "description": "Hugging Face's Text Generation Inference (TGI) service for optimized text generation", + "category": ["LLM", "API"], + "icon": "https://huggingface.co/front/assets/huggingface_logo-noborder.svg" +} \ No newline at end of file diff --git a/templates/TGI-API/job-definition.json b/templates/TGI-API/job-definition.json index 0519ecb..f2d6b78 100644 --- a/templates/TGI-API/job-definition.json +++ b/templates/TGI-API/job-definition.json @@ -1 +1,24 @@ - \ No newline at end of file +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "benchmark" + }, + "ops": [ + { + "type": "container/run", + "id": "tgi", + "args": { + "entrypoint": [], + "cmd": [ + "/bin/bash", + "-c", + "text-generation-launcher --model-id Qwen/Qwen2.5-7B --port 8080" + ], + "image": "ghcr.io/huggingface/text-generation-inference:2.3.1", + "gpu": true, + "expose": 8080 + } + } + ] +} \ No newline at end of file diff --git a/templates/Tensorflow-jupyter-notebook/README.md b/templates/Tensorflow-jupyter-notebook/README.md index da329f5..25f5509 100644 --- a/templates/Tensorflow-jupyter-notebook/README.md +++ b/templates/Tensorflow-jupyter-notebook/README.md @@ -1,5 +1,19 @@ -# Jupyter Notebook Template +# TensorFlow Jupyter Notebook -![Jupyter Notebook](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Tensorflow-jupyter-notebook/jupyter.gif) +![TensorFlow Jupyter](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Tensorflow-jupyter-notebook/jupyter.gif) -Harness the power of Nosana Endpoint to seamlessly run Jupyter Notebooks and connect via a user-friendly web interface. With access to GPU-backed nodes, you can conduct your experiments efficiently and cost-effectively, unlocking new possibilities for your research and data analysis +A Jupyter Notebook environment with TensorFlow pre-installed for machine learning development. + +Unleash the power of TensorFlow with Nosana! Effortlessly run your Jupyter environment on high-performance GPU-backed nodes, ensuring optimal performance for your ML projects. + +## Key Features +- Interactive Python environment +- Pre-installed TensorFlow +- CUDA support +- Notebook sharing +- GPU acceleration support + +## Configuration +- Port: 8888 +- GPU: Required +- No authentication required diff --git a/templates/Tensorflow-jupyter-notebook/info.json b/templates/Tensorflow-jupyter-notebook/info.json index 1d6f1d9..cce152f 100644 --- a/templates/Tensorflow-jupyter-notebook/info.json +++ b/templates/Tensorflow-jupyter-notebook/info.json @@ -2,6 +2,6 @@ "id": "jupyter-notebook-tensorflow", "name": "Jupyter Notebook with Tensorflow", "description": "Jupyter Notebook Service", - "category": ["Featured"], + "category": ["Web UI", "Featured"], "icon": "https://seeklogo.com/images/J/jupyter-logo-A91705F539-seeklogo.com.png" } \ No newline at end of file diff --git a/templates/Text-To-Speech-UI/README.md b/templates/Text-To-Speech-UI/README.md index 0519ecb..d7a606b 100644 --- a/templates/Text-To-Speech-UI/README.md +++ b/templates/Text-To-Speech-UI/README.md @@ -1 +1,19 @@ - \ No newline at end of file +# Text To Speech Generation UI + +![TTS UI](link-to-image) + +A web interface for generating natural-sounding speech from text using various TTS models. + +Unleash the power of speech synthesis with Nosana! Effortlessly run your TTS instance on high-performance GPU-backed nodes, ensuring optimal audio generation for your projects. + +## Key Features +- Multiple voice models +- Language support +- Voice customization +- Batch processing +- GPU acceleration support + +## Configuration +- Port: 3000 +- GPU: Required +- Web interface access \ No newline at end of file diff --git a/templates/Text-To-Speech-UI/info.json b/templates/Text-To-Speech-UI/info.json index 0519ecb..6d1ef19 100644 --- a/templates/Text-To-Speech-UI/info.json +++ b/templates/Text-To-Speech-UI/info.json @@ -1 +1,7 @@ - \ No newline at end of file +{ + "id": "tts-generation-webui", + "name": "Text to Speech Generation UI", + "description": "A web interface for generating speech from text using various TTS models", + "category": ["Web UI", "Featured"], + "icon": "https://raw.githubusercontent.com/rsxdalv/tts-generation-webui/main/images/logo.png" +} \ No newline at end of file diff --git a/templates/Text-To-Speech-UI/job-definition.json b/templates/Text-To-Speech-UI/job-definition.json index 0519ecb..b21ae8b 100644 --- a/templates/Text-To-Speech-UI/job-definition.json +++ b/templates/Text-To-Speech-UI/job-definition.json @@ -1 +1,19 @@ - \ No newline at end of file +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "cli" + }, + "ops": [ + { + "type": "container/run", + "id": "tts-generation-webui", + "args": { + "image": "ghcr.io/rsxdalv/tts-generation-webui:main", + "cmd": [], + "gpu": true, + "expose": 3000 + } + } + ] +} \ No newline at end of file diff --git a/templates/VLLM-API/README.md b/templates/VLLM-API/README.md index 0519ecb..d34deba 100644 --- a/templates/VLLM-API/README.md +++ b/templates/VLLM-API/README.md @@ -1 +1,19 @@ - \ No newline at end of file +# vLLM API + +![vLLM](link-to-image) + +A high-throughput and memory-efficient inference engine for Large Language Models. + +Unleash the power of efficient LLM inference with Nosana! Effortlessly run your vLLM instance on high-performance GPU-backed nodes, ensuring optimal serving for your applications. + +## Key Features +- PagedAttention technology +- Continuous batching +- OpenAI-compatible API +- Memory optimization +- GPU acceleration support + +## Configuration +- Port: 8080 +- GPU: Required +- Model: Qwen2.5-7B \ No newline at end of file diff --git a/templates/VLLM-API/info.json b/templates/VLLM-API/info.json index 0519ecb..324e78e 100644 --- a/templates/VLLM-API/info.json +++ b/templates/VLLM-API/info.json @@ -1 +1,7 @@ - \ No newline at end of file +{ + "id": "vllm-api", + "name": "vLLM API", + "description": "High-throughput and memory-efficient inference engine for LLMs", + "category": ["API Only", "LLM"], + "icon": "https://vllm.ai/assets/images/vllm-logo-dark.svg" +} \ No newline at end of file diff --git a/templates/VLLM-API/job-definition.json b/templates/VLLM-API/job-definition.json index 0519ecb..a6d056a 100644 --- a/templates/VLLM-API/job-definition.json +++ b/templates/VLLM-API/job-definition.json @@ -1 +1,24 @@ - \ No newline at end of file +{ + "version": "0.1", + "type": "container", + "meta": { + "trigger": "benchmark" + }, + "ops": [ + { + "type": "container/run", + "id": "vllm", + "args": { + "entrypoint": [], + "cmd": [ + "/bin/sh", + "-c", + "python3 -m vllm.entrypoints.openai.api_server --model Qwen/Qwen2.5-7B --served-model-name Qwen2.5-7B" + ], + "image": "docker.io/vllm/vllm-openai:v0.5.4", + "gpu": true, + "expose": 8080 + } + } + ] +} \ No newline at end of file diff --git a/templates/VScode-server/README.md b/templates/VScode-server/README.md index 02fd590..2f12804 100644 --- a/templates/VScode-server/README.md +++ b/templates/VScode-server/README.md @@ -2,67 +2,21 @@ ![VSCode Server](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/vscode-server/vscode_server.mp4) -VSCode Server allows you to run Visual Studio Code on a remote server and access it through your browser. This setup provides a consistent and powerful development environment accessible from anywhere, whether you're on a Chromebook, tablet, laptop, or desktop. +A full-featured development environment accessible through your web browser. -**Key Features:** +Unleash the power of cloud development with Nosana! Effortlessly run your VSCode Server instance on high-performance GPU-backed nodes, ensuring optimal development experience for your projects. -- **Remote Development:** Access your development environment from any device with a web browser. -- **Resource Efficiency:** Leverage powerful cloud servers to handle intensive computations, tests, compilations, and more. -- **Seamless Integration:** Easily integrate with GitHub by adding your SSH keys. -- **Customizable Environment:** Configure user and group IDs, timezone, and secure access with passwords. -- **Scalable:** Utilize GPU-backed nodes for enhanced performance when needed. - -**Unleash the power of remote development with Nosana!** Effortlessly deploy and manage your VSCode Server instance on high-performance GPU-backed nodes, ensuring a smooth and efficient coding experience for your projects. - -Whether you're developing software, managing repositories, or collaborating with a team, Nosana provides the infrastructure and tools you need to leverage VSCode Server effectively. - -## Getting Started - -1. **Deploy the Template:** - Use the Nosana platform to deploy the VSCode Server template. - -2. **Access the Web Interface:** - Navigate to `https://
` in your web browser to access the VSCode interface. - -3. **Configure GitHub Integration (Optional):** - - Add your SSH key to `/config/.ssh` for GitHub integration. - - Open a terminal within VSCode and set your GitHub username and email: - ```bash - git config --global user.name "your_username" - git config --global user.email "your_email@example.com" - ``` - -4. **Secure Your Instance:** - - Set a strong `SUDO_PASSWORD` in the environment variables to secure terminal access. +## Key Features +- Full IDE capabilities +- Extension support +- Terminal access +- Git integration +- GPU acceleration support ## Configuration +- Port: 8443 +- GPU: Required +- Password protection -- **Environment Variables:** - - `PUID=1000`: User ID for file permissions. - - `PGID=1000`: Group ID for file permissions. - - `TZ=Etc/UTC`: Timezone setting. - - `SUDO_PASSWORD=password`: Password for sudo access in the terminal. - -- **Ports:** - - `8443`: Access the VSCode web interface. - -- **Volume Mappings:** - - `/config`: Contains all relevant configuration files and settings. - -## Notes - -- **GPU Requirements:** - - This container is configured to use GPU resources. Ensure your deployment node has a GPU with sufficient capabilities if needed. - -- **Security:** - - If `PASSWORD` or `HASHED_PASSWORD` is not set, there will be no authentication for the web interface. It's recommended to set at least one for security. - -- **Updating:** - - To update the container, pull the latest image and recreate the container using your deployment method (Docker Compose or Docker CLI). - ---- - -### **Directory Structure:** -Ensure you create a new directory named `vscode-server` inside your `templates` directory. The structure should look like this: diff --git a/templates/VScode-server/info.json b/templates/VScode-server/info.json index 2b4ec5e..7023b61 100644 --- a/templates/VScode-server/info.json +++ b/templates/VScode-server/info.json @@ -2,6 +2,6 @@ "id": "vscode-server", "name": "VSCode Server", "description": "Run Visual Studio Code on a remote server accessible through your browser, enabling a consistent and powerful development environment.", - "category": ["Development", "IDE", "GPU", "Service", "Featured"], + "category": ["Web UI", "Featured"], "icon": "https://avatars.githubusercontent.com/u/12324908?s=280&v=4" } diff --git a/templates/Whisper-ASR-API/README.md b/templates/Whisper-ASR-API/README.md index d789228..457a092 100644 --- a/templates/Whisper-ASR-API/README.md +++ b/templates/Whisper-ASR-API/README.md @@ -1,16 +1,19 @@ -# Whisper ASR Webservice +# Whisper ASR API ![Whisper ASR Webservice](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/whisper-asr-webservice/whisper_asr_webservice.mp4) -Whisper ASR Webservice is a powerful speech recognition API built on OpenAI's Whisper model. It supports multilingual speech recognition, translation, and language identification, making it ideal for a wide range of applications from transcription services to real-time translation tools. +A robust speech recognition service powered by OpenAI's Whisper model. -**Key Features:** +Unleash the power of speech recognition with Nosana! Effortlessly run your Whisper ASR instance on high-performance GPU-backed nodes, ensuring optimal transcription for your audio processing needs. -- **Multilingual Support:** Transcribe and translate audio in multiple languages. -- **Flexible Deployment:** Easily run on GPU-backed nodes for enhanced performance. -- **API Integration:** Seamlessly integrate with existing applications using the OpenAI-compatible API. -- **Scalable:** Designed to handle varying workloads efficiently. +## Key Features +- Multilingual transcription +- Translation support +- Language identification +- RESTful API interface +- GPU acceleration support -**Unleash the power of advanced speech recognition with Nosana!** Effortlessly deploy and manage your Whisper ASR Webservice instance on high-performance GPU-backed nodes, ensuring accurate and efficient transcription for your projects. - -Whether you're developing a transcription service, building real-time translation tools, or integrating speech recognition into your applications, Nosana provides the infrastructure and tools you need to leverage Whisper ASR Webservice effectively. +## Configuration +- Port: 9000 +- GPU: Required +- Model: Whisper Base diff --git a/templates/Whisper-ASR-API/info.json b/templates/Whisper-ASR-API/info.json index e11df3b..7ceae35 100644 --- a/templates/Whisper-ASR-API/info.json +++ b/templates/Whisper-ASR-API/info.json @@ -2,6 +2,6 @@ "id": "whisper-asr-webservice", "name": "Whisper ASR Webservice", "description": "A robust speech recognition service powered by OpenAI's Whisper model, supporting multilingual transcription, translation, and language identification.", - "category": ["Featured"], + "category": ["API Only", "Featured"], "icon": "https://www.datocms-assets.com/96965/1685731715-open-ai-stars-2x.png" } diff --git a/templates/open-webui-ollama/README.md b/templates/open-webui-ollama/README.md index 563b9ee..4aa6ac9 100644 --- a/templates/open-webui-ollama/README.md +++ b/templates/open-webui-ollama/README.md @@ -1,5 +1,19 @@ -# Open WebUI +# Open WebUI for Ollama ![Open WebUI](https://raw.githubusercontent.com/nosana-ci/templates/refs/heads/main/templates/Open-webui-ollama/openwebui.gif) -Open WebUI is an extensible, feature-rich, and user-friendly self-hosted WebUI designed to operate entirely offline. It supports various LLM runners, including Ollama and OpenAI-compatible APIs. With Nosana we can run an instance of Open WebUI and connect to it via a Nosana Endpoint. +A user-friendly web interface for interacting with Ollama's language models. + +Unleash the power of LLMs with Nosana! Effortlessly run your Open WebUI instance on high-performance GPU-backed nodes, ensuring optimal chat experience for your applications. + +## Key Features +- Multiple model support +- Chat interface +- System prompt templates +- Model management +- GPU acceleration support + +## Configuration +- Port: 8080 +- GPU: Required +- No authentication required diff --git a/templates/open-webui-ollama/info.json b/templates/open-webui-ollama/info.json index e94562a..9bf3997 100644 --- a/templates/open-webui-ollama/info.json +++ b/templates/open-webui-ollama/info.json @@ -2,6 +2,6 @@ "id": "open-webui", "name": "Open WebUI using Ollama", "description": "Open WebUI supports various LLM models", - "category": ["LLM"], + "category": ["Web UI", "LLM"], "icon": "https://openwebui.com/user.png" } \ No newline at end of file