cyberkyne commited on
Commit
db8339d
Β·
verified Β·
1 Parent(s): 1a56c89

Upload 22 files

Browse files
Files changed (3) hide show
  1. Dockerfile +6 -4
  2. pipeline/julia_bridge.py +1 -0
  3. 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↔Julia bridge at build time.
4
- Called from Dockerfile Step 3 β€” runs once, caches the Julia
5
- session location so runtime startup is instant.
6
  """
7
- import os
8
- import sys
9
 
10
- os.environ["JULIA_PROJECT"] = "/app/src"
11
- os.environ["JULIA_DEPOT_PATH"] = "/app/.julia"
12
- os.environ["JULIA_BINDIR"] = "/usr/local/julia/bin"
 
 
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 failed: {e}")
30
- print("App will still work β€” Julia initialises on first request instead.")
31
- sys.exit(0) # Non-fatal β€” don't break the build
 
 
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