| # ============================================================================== | |
| # ARGUMENTS | |
| # ============================================================================== | |
| # Define the CANN base image for easier version updates later | |
| ARG CANN_BASE_IMAGE=quay.io/ascend/cann:8.1.rc1-910b-openeuler22.03-py3.10 | |
| # ============================================================================== | |
| # BUILD STAGE | |
| # Compile all binary files and libraries | |
| # ============================================================================== | |
| FROM ${CANN_BASE_IMAGE} AS build | |
| # Define the Ascend chip model for compilation. Default is Ascend910B3 | |
| ARG ASCEND_SOC_TYPE=Ascend910B3 | |
| # -- Install build dependencies -- | |
| RUN yum install -y gcc g++ cmake make git libcurl-devel python3 python3-pip && \ | |
| yum clean all && \ | |
| rm -rf /var/cache/yum | |
| # -- Set the working directory -- | |
| WORKDIR /app | |
| # -- Copy project files -- | |
| COPY . . | |
| # -- Set CANN environment variables (required for compilation) -- | |
| # Using ENV instead of `source` allows environment variables to persist across the entire image layer | |
| ENV ASCEND_TOOLKIT_HOME=/usr/local/Ascend/ascend-toolkit/latest | |
| ENV LD_LIBRARY_PATH=${ASCEND_TOOLKIT_HOME}/lib64:${LD_LIBRARY_PATH} | |
| ENV PATH=${ASCEND_TOOLKIT_HOME}/bin:${PATH} | |
| ENV ASCEND_OPP_PATH=${ASCEND_TOOLKIT_HOME}/opp | |
| ENV LD_LIBRARY_PATH=${ASCEND_TOOLKIT_HOME}/runtime/lib64/stub:$LD_LIBRARY_PATH | |
| # ... You can add other environment variables from the original file as needed ... | |
| # For brevity, only core variables are listed here. You can paste the original ENV list here. | |
| # -- Build llama.cpp -- | |
| # Use the passed ASCEND_SOC_TYPE argument and add general build options | |
| RUN source /usr/local/Ascend/ascend-toolkit/set_env.sh --force \ | |
| && \ | |
| cmake -B build \ | |
| -DGGML_CANN=ON \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -DSOC_TYPE=${ASCEND_SOC_TYPE} \ | |
| . && \ | |
| cmake --build build --config Release -j$(nproc) | |
| # -- Organize build artifacts for copying in later stages -- | |
| # Create a lib directory to store all .so files | |
| RUN mkdir -p /app/lib && \ | |
| find build -name "*.so" -exec cp {} /app/lib \; | |
| # Create a full directory to store all executables and Python scripts | |
| RUN mkdir -p /app/full && \ | |
| cp build/bin/* /app/full/ && \ | |
| cp *.py /app/full/ && \ | |
| cp -r gguf-py /app/full/ && \ | |
| cp -r requirements /app/full/ && \ | |
| cp requirements.txt /app/full/ | |
| # If you have a tools.sh script, make sure it is copied here | |
| # cp .devops/tools.sh /app/full/tools.sh | |
| # ============================================================================== | |
| # BASE STAGE | |
| # Create a minimal base image with CANN runtime and common libraries | |
| # ============================================================================== | |
| FROM ${CANN_BASE_IMAGE} AS base | |
| # -- Install runtime dependencies -- | |
| RUN yum install -y libgomp curl && \ | |
| yum clean all && \ | |
| rm -rf /var/cache/yum | |
| # -- Set CANN environment variables (required for runtime) -- | |
| ENV ASCEND_TOOLKIT_HOME=/usr/local/Ascend/ascend-toolkit/latest | |
| ENV LD_LIBRARY_PATH=/app:${ASCEND_TOOLKIT_HOME}/lib64:${LD_LIBRARY_PATH} | |
| ENV PATH=${ASCEND_TOOLKIT_HOME}/bin:${PATH} | |
| ENV ASCEND_OPP_PATH=${ASCEND_TOOLKIT_HOME}/opp | |
| # ... You can add other environment variables from the original file as needed ... | |
| WORKDIR /app | |
| # Copy compiled .so files from the build stage | |
| COPY --from=build /app/lib/ /app | |
| # ============================================================================== | |
| # FINAL STAGES (TARGETS) | |
| # ============================================================================== | |
| ### Target: full | |
| # Complete image with all tools, Python bindings, and dependencies | |
| # ============================================================================== | |
| FROM base AS full | |
| COPY --from=build /app/full /app | |
| # Install Python dependencies | |
| RUN yum install -y git python3 python3-pip && \ | |
| pip3 install --no-cache-dir --upgrade pip setuptools wheel && \ | |
| pip3 install --no-cache-dir -r requirements.txt && \ | |
| yum clean all && \ | |
| rm -rf /var/cache/yum | |
| # You need to provide a tools.sh script as the entrypoint | |
| ENTRYPOINT ["/app/tools.sh"] | |
| # If there is no tools.sh, you can set the default to start the server | |
| # ENTRYPOINT ["/app/llama-server"] | |
| ### Target: light | |
| # Lightweight image containing only llama-cli | |
| # ============================================================================== | |
| FROM base AS light | |
| COPY --from=build /app/full/llama-cli /app | |
| ENTRYPOINT [ "/app/llama-cli" ] | |
| ### Target: server | |
| # Dedicated server image containing only llama-server | |
| # ============================================================================== | |
| FROM base AS server | |
| ENV LLAMA_ARG_HOST=0.0.0.0 | |
| COPY --from=build /app/full/llama-server /app | |
| HEALTHCHECK --interval=5m CMD [ "curl", "-f", "http://localhost:8080/health" ] | |
| ENTRYPOINT [ "/app/llama-server" ] | |