Spaces:
Sleeping
Sleeping
Upload 22 files
Browse files- Dockerfile +6 -4
- pipeline/julia_bridge.py +1 -0
- src/warmup_bridge.py +14 -15
Dockerfile
CHANGED
|
@@ -23,6 +23,7 @@ ENV JULIA_DEPOT_PATH=/app/.julia
|
|
| 23 |
ENV JULIA_NUM_THREADS=4
|
| 24 |
ENV JULIA_PROJECT=/app/src
|
| 25 |
ENV JULIA_BINDIR=/usr/local/julia/bin
|
|
|
|
| 26 |
|
| 27 |
WORKDIR /app
|
| 28 |
|
|
@@ -33,11 +34,11 @@ RUN pip install --no-cache-dir -r /tmp/requirements.txt
|
|
| 33 |
# ββ Copy project files ββββββββββββββββββββββββββββββββ
|
| 34 |
COPY . .
|
| 35 |
|
| 36 |
-
# ββ Step 1: Warmup β JIT-compile all hot paths ββββ
|
| 37 |
-
RUN julia --project=/app/src /app/src/warmup.jl
|
| 38 |
|
| 39 |
-
# ββ Step 3: Pre-warm juliacall PythonβJulia bridge ββββ
|
| 40 |
-
RUN python3 /app/src/warmup_bridge.py
|
| 41 |
|
| 42 |
# ββ Runtime βββββββββββββββββββββββββββββββββββββββββββ
|
| 43 |
ENV GRADIO_SERVER_NAME=0.0.0.0
|
|
@@ -45,6 +46,7 @@ ENV GRADIO_SERVER_PORT=7860
|
|
| 45 |
ENV JULIA_PROJECT=/app/src
|
| 46 |
ENV JULIA_DEPOT_PATH=/app/.julia
|
| 47 |
ENV JULIA_BINDIR=/usr/local/julia/bin
|
|
|
|
| 48 |
|
| 49 |
EXPOSE 7860
|
| 50 |
CMD ["python", "app.py"]
|
|
|
|
| 23 |
ENV JULIA_NUM_THREADS=4
|
| 24 |
ENV JULIA_PROJECT=/app/src
|
| 25 |
ENV JULIA_BINDIR=/usr/local/julia/bin
|
| 26 |
+
ENV PYTHON_JULIAPKG_OFFLINE=yes
|
| 27 |
|
| 28 |
WORKDIR /app
|
| 29 |
|
|
|
|
| 34 |
# ββ Copy project files ββββββββββββββββββββββββββββββββ
|
| 35 |
COPY . .
|
| 36 |
|
| 37 |
+
# ββ Step 1: Warmup β JIT-compile all hot paths (non-fatal) ββββ
|
| 38 |
+
RUN julia --project=/app/src /app/src/warmup.jl || true
|
| 39 |
|
| 40 |
+
# ββ Step 3: Pre-warm juliacall PythonβJulia bridge (non-fatal) ββββ
|
| 41 |
+
RUN python3 /app/src/warmup_bridge.py || true
|
| 42 |
|
| 43 |
# ββ Runtime βββββββββββββββββββββββββββββββββββββββββββ
|
| 44 |
ENV GRADIO_SERVER_NAME=0.0.0.0
|
|
|
|
| 46 |
ENV JULIA_PROJECT=/app/src
|
| 47 |
ENV JULIA_DEPOT_PATH=/app/.julia
|
| 48 |
ENV JULIA_BINDIR=/usr/local/julia/bin
|
| 49 |
+
ENV PYTHON_JULIAPKG_OFFLINE=yes
|
| 50 |
|
| 51 |
EXPOSE 7860
|
| 52 |
CMD ["python", "app.py"]
|
pipeline/julia_bridge.py
CHANGED
|
@@ -39,6 +39,7 @@ def _init_julia():
|
|
| 39 |
logger.info("Initializing Julia runtimeβ¦")
|
| 40 |
# Tell juliapkg to use the system Julia installed in the Docker image
|
| 41 |
os.environ.setdefault("JULIA_BINDIR", "/usr/local/julia/bin")
|
|
|
|
| 42 |
os.environ.setdefault("JULIA_PROJECT", str(JULIA_SRC))
|
| 43 |
os.environ.setdefault("JULIA_DEPOT_PATH", "/app/.julia")
|
| 44 |
try:
|
|
|
|
| 39 |
logger.info("Initializing Julia runtimeβ¦")
|
| 40 |
# Tell juliapkg to use the system Julia installed in the Docker image
|
| 41 |
os.environ.setdefault("JULIA_BINDIR", "/usr/local/julia/bin")
|
| 42 |
+
os.environ.setdefault("PYTHON_JULIAPKG_OFFLINE", "yes")
|
| 43 |
os.environ.setdefault("JULIA_PROJECT", str(JULIA_SRC))
|
| 44 |
os.environ.setdefault("JULIA_DEPOT_PATH", "/app/.julia")
|
| 45 |
try:
|
src/warmup_bridge.py
CHANGED
|
@@ -1,15 +1,15 @@
|
|
| 1 |
"""
|
| 2 |
warmup_bridge.py
|
| 3 |
-
Pre-warms the juliacall Python
|
| 4 |
-
|
| 5 |
-
session location so runtime startup is instant.
|
| 6 |
"""
|
| 7 |
-
import os
|
| 8 |
-
import sys
|
| 9 |
|
| 10 |
-
|
| 11 |
-
os.environ["
|
| 12 |
-
os.environ["
|
|
|
|
|
|
|
| 13 |
|
| 14 |
print("Pre-warming juliacall bridge...")
|
| 15 |
try:
|
|
@@ -17,15 +17,14 @@ try:
|
|
| 17 |
jl.seval('push!(LOAD_PATH, "/app/src")')
|
| 18 |
jl.seval('include("/app/src/QuantEngine.jl")')
|
| 19 |
jl.seval("using .QuantEngine")
|
| 20 |
-
|
| 21 |
-
# Quick sanity check β call one indicator through the bridge
|
| 22 |
import numpy as np
|
| 23 |
c = (100.0 * np.exp(np.cumsum(np.random.randn(100) * 0.005))).tolist()
|
| 24 |
result = jl.QuantEngine.sma(jl.convert(jl.Vector[jl.Float64], c), 20)
|
| 25 |
-
assert len(result) == 100
|
| 26 |
print("juliacall bridge warmed up β")
|
| 27 |
-
sys.exit(0)
|
| 28 |
except Exception as e:
|
| 29 |
-
print(f"WARNING: juliacall warmup
|
| 30 |
-
print("
|
| 31 |
-
|
|
|
|
|
|
| 1 |
"""
|
| 2 |
warmup_bridge.py
|
| 3 |
+
Pre-warms the juliacall Python<->Julia bridge at build time.
|
| 4 |
+
Non-fatal: always exits 0 so Docker build never fails here.
|
|
|
|
| 5 |
"""
|
| 6 |
+
import os, sys
|
|
|
|
| 7 |
|
| 8 |
+
# Tell juliapkg to use the pre-installed Julia and NEVER download anything
|
| 9 |
+
os.environ["JULIA_PROJECT"] = "/app/src"
|
| 10 |
+
os.environ["JULIA_DEPOT_PATH"] = "/app/.julia"
|
| 11 |
+
os.environ["JULIA_BINDIR"] = "/usr/local/julia/bin"
|
| 12 |
+
os.environ["PYTHON_JULIAPKG_OFFLINE"] = "yes" # critical: no downloads
|
| 13 |
|
| 14 |
print("Pre-warming juliacall bridge...")
|
| 15 |
try:
|
|
|
|
| 17 |
jl.seval('push!(LOAD_PATH, "/app/src")')
|
| 18 |
jl.seval('include("/app/src/QuantEngine.jl")')
|
| 19 |
jl.seval("using .QuantEngine")
|
| 20 |
+
# Sanity check via the bridge
|
|
|
|
| 21 |
import numpy as np
|
| 22 |
c = (100.0 * np.exp(np.cumsum(np.random.randn(100) * 0.005))).tolist()
|
| 23 |
result = jl.QuantEngine.sma(jl.convert(jl.Vector[jl.Float64], c), 20)
|
| 24 |
+
assert len(list(result)) == 100
|
| 25 |
print("juliacall bridge warmed up β")
|
|
|
|
| 26 |
except Exception as e:
|
| 27 |
+
print(f"WARNING: juliacall warmup skipped: {e}")
|
| 28 |
+
print("Julia will initialise on first user request instead.")
|
| 29 |
+
|
| 30 |
+
sys.exit(0) # always succeed β this is optional warmup
|