File size: 3,133 Bytes
5d63abc
47da386
 
 
 
 
afa36df
 
 
1546593
afa36df
 
5d63abc
 
 
 
1546593
 
 
5d63abc
1546593
5d63abc
1546593
5d63abc
 
1546593
5d63abc
47da386
 
 
 
 
 
 
 
afa36df
 
 
 
5d63abc
 
290df04
1546593
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1c6e0d5
1546593
 
 
 
 
992e4ec
1546593
 
 
 
5d63abc
 
 
 
47da386
afa36df
47da386
1546593
1c6e0d5
47da386
1546593
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# Use an official PyTorch image as a base
FROM pytorch/pytorch:2.1.0-cuda11.8-cudnn8-runtime

# Set the working directory inside the container
WORKDIR /app

# Install system dependencies
RUN apt-get update && apt-get install -y \
    build-essential \
    git \
    && rm -rf /var/lib/apt/lists/*

# Create a non-root user
RUN useradd -m -u 1000 appuser

# Create cache directories and set permissions
RUN mkdir -p /app/models/sentence_transformer && \
    mkdir -p /app/models/qwen && \
    mkdir -p /.cache/huggingface && \
    mkdir -p /.cache/torch && \
    mkdir -p /.cache/sentence_transformers

# Set environment variables for cache and model locations
ENV HF_HOME="/.cache/huggingface"
ENV TORCH_HOME="/.cache/torch"
ENV SENTENCE_TRANSFORMERS_HOME="/app/models/sentence_transformer"

# Install Python dependencies
RUN pip install --no-cache-dir \
    pandas \
    torch \
    sentence-transformers \
    transformers \
    numpy \
    faiss-cpu \
    fastapi \
    uvicorn[standard] \
    pydantic \
    python-multipart \
    huggingface_hub \
    accelerate>=0.26.0

# Create a script to download models
COPY <<EOF /app/download_models.py
import os
from sentence_transformers import SentenceTransformer
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

# Download and save sentence transformer model
print("Downloading sentence transformer model...")
model = SentenceTransformer("sentence-transformers/all-mpnet-base-v2")
model.save("/app/models/sentence_transformer")
print("Sentence transformer model saved successfully!")

# Download and save Qwen model and tokenizer
print("Downloading Qwen model and tokenizer...")
model_name = "Qwen/Qwen2.5-0.5B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    trust_remote_code=True,
    torch_dtype=torch.float16,
    device_map=None
)

tokenizer.save_pretrained("/app/models/qwen")
model.save_pretrained("/app/models/qwen")
print("Qwen model and tokenizer saved successfully!")
EOF

# Download models during build
RUN python /app/download_models.py

# Only set TRANSFORMERS_OFFLINE after downloading models
ENV TRANSFORMERS_OFFLINE=1

# Copy the main.py and modify it to use local paths
COPY main.py /app/main.py
RUN sed -i 's|"sentence-transformers/all-mpnet-base-v2"|"/app/models/sentence_transformer"|g' main.py && \
    sed -i 's|"Qwen/Qwen2.5-0.5B-Instruct"|"/app/models/qwen"|g' main.py

# Copy the data file
COPY plant_data_chunks_and_embeddings.csv /app/plant_data_chunks_and_embeddings.csv

# Set proper permissions
RUN chown -R appuser:appuser /app && \
    chown -R appuser:appuser /.cache && \
    chmod -R 755 /app/models

# Switch to non-root user
USER appuser

# Set the environment variable to point to the app directory
ENV PYTHONPATH=/app

# Expose the port
EXPOSE 5000

# Reduce model loading time by setting specific environment variables
ENV OMP_NUM_THREADS=1
ENV MKL_NUM_THREADS=1
ENV TORCH_NUM_THREADS=1

# Command to run the app
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "5000", "--timeout-keep-alive", "300"]