Spaces:
Running
Running
| # Deploying Fugee β Hugging Face Space + Modal | |
| The demo runs in two pieces: the **Gradio UI on a free HF CPU Space**, calling the | |
| **LLM + embeddings on a GPU Ollama endpoint on Modal**. Same code, same model | |
| (`lfm2.5:8b`), just on rented GPU. | |
| ``` | |
| HF Space (free CPU) ββHTTPS, proxy-authβββΆ Modal (L4 GPU, ollama serve) | |
| app/app.py lfm2.5:8b + nomic-embed-text | |
| ``` | |
| Run the steps in order. Steps that only the maintainer can do (auth, secrets) are | |
| marked **[you]**. | |
| --- | |
| ## 0. Prerequisites (already done in this repo) | |
| - `deploy/modal_app.py` is deployed and **kept warm** | |
| (`MODAL_MIN_CONTAINERS=1`) β endpoint `https://hf-labs--fugee-ollama-serve.modal.run`. | |
| - A Modal **Proxy Auth Token** exists; its id/secret are in `.env.modal` | |
| (gitignored) as `MODAL_KEY` / `MODAL_SECRET`. | |
| - Models cached in the Modal Volume (`modal run deploy/modal_app.py::download_models`). | |
| Re-check the endpoint is warm before a demo: | |
| ```bash | |
| set -a; . ./.env.modal; set +a | |
| curl -s -o /dev/null -w "%{http_code}\n" \ | |
| https://hf-labs--fugee-ollama-serve.modal.run/api/version \ | |
| -H "Modal-Key: $MODAL_KEY" -H "Modal-Secret: $MODAL_SECRET" # expect 200 | |
| ``` | |
| --- | |
| ## 1. **[you]** Authenticate the HF CLI | |
| Create a token with **write** access at <https://huggingface.co/settings/tokens>, | |
| then: | |
| ```bash | |
| hf auth login # paste the write token | |
| ``` | |
| --- | |
| ## 2. **[you]** Create the Space in the hackathon org | |
| Web: **New Space** β Owner `build-small-hackathon`, name `fugee`, SDK **Gradio**, | |
| hardware **CPU basic (free)**, **Public**. Or CLI: | |
| ```bash | |
| hf repo create build-small-hackathon/fugee --repo-type space --space-sdk gradio | |
| ``` | |
| (If the flag name differs on your CLI version, run `hf repo create --help`.) | |
| --- | |
| ## 3. Push the code to the Space | |
| The Space is its own git repo. Add it as a remote and push `main` (force, to | |
| replace the starter README HF created on the first deploy): | |
| ```bash | |
| git remote add space https://huggingface.co/spaces/build-small-hackathon/fugee | |
| git push space main --force | |
| ``` | |
| This pushes everything except gitignored files β code, `countries.json`, | |
| `countries_enriched.json`, bundled fonts, etc. It does **not** include the binary | |
| data the HF Hub requires Xet/LFS for β the 23 MB RAG index and the source PDFs β | |
| which are uploaded next. The Space starts building on push. | |
| --- | |
| ## 4. Upload the binary data (RAG index + source PDFs) | |
| The HF Hub requires binary files to use Xet/LFS, which `hf upload` does | |
| automatically (no local git-lfs needed). | |
| The RAG index β needed at runtime by `guideline_search`: | |
| ```bash | |
| hf upload build-small-hackathon/fugee \ | |
| specs/data/guidelines_index.json specs/data/guidelines_index.json \ | |
| --repo-type space | |
| ``` | |
| The 15 source UNHCR PDFs β not needed at runtime, but uploaded so the index's | |
| provenance is visible on the Space (upload the whole folder): | |
| ```bash | |
| hf upload build-small-hackathon/fugee \ | |
| specs/data/guidelines specs/data/guidelines \ | |
| --repo-type space | |
| ``` | |
| --- | |
| ## 5. **[you]** Set the Space secrets & variables | |
| Space β **Settings β Variables and secrets**. The app reads these from the | |
| environment (its `.env` loader never overrides real env vars). | |
| **Secrets** (encrypted): | |
| | Name | Value | | |
| |------|-------| | |
| | `OLLAMA_HOST` | `https://hf-labs--fugee-ollama-serve.modal.run` | | |
| | `MODAL_KEY` | your Modal Proxy Auth Token id (`wk-β¦`) | | |
| | `MODAL_SECRET` | your Modal Proxy Auth Token secret (`ws-β¦`) | | |
| **Variables** (public): | |
| | Name | Value | | |
| |------|-------| | |
| | `MODEL_ID` | `lfm2.5:8b` | | |
| | `MODEL_PROVIDER` | `ollama` | | |
| | `NUM_CTX` | `16384` | | |
| > `MODEL_ID` **must** be set β the code default is `qwen2.5:7b`, which isn't on | |
| > the Modal endpoint. `OLLAMA_HOST` + `MODAL_KEY` + `MODAL_SECRET` are required for | |
| > the Space to reach the model. The Modal **account** token never goes here β it | |
| > stays in `~/.modal.toml` on your machine. | |
| Setting a secret restarts the Space. | |
| --- | |
| ## 6. Verify the live Space | |
| Open `https://huggingface.co/spaces/build-small-hackathon/fugee`, wait for the | |
| build (watch the **Logs** tab), then walk a full flow: language β interview β | |
| assessment β recommendations β documents. First model call may take a few seconds | |
| even though Modal is warm. | |
| If PDF generation errors in the logs, it's a missing system lib β confirm | |
| `packages.txt` installed (Pango/HarfBuzz/Noto fonts). | |
| --- | |
| ## 7. Submit & costs | |
| - **Submission:** on the hackathon *submit* page, enter `fugee` under | |
| `build-small-hackathon/` β it loads the README and writes track/badge tags into | |
| the frontmatter β commit that back (`git pull space main` then push, or edit on HF). | |
| - **GPU limit:** the "10 ZeroGPU apps per user" rule does **not** apply β we use | |
| Modal, not ZeroGPU. | |
| - **After the demo window**, stop the Modal meter: | |
| ```bash | |
| MODAL_MIN_CONTAINERS=0 modal deploy deploy/modal_app.py # scale to zero | |
| # or fully stop: | |
| modal app stop fugee-ollama | |
| ``` | |
| Scale-to-zero keeps the deployment but costs nothing while idle (cold start | |
| ~40 s on the next request). | |