Dockerfile 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. # vim: filetype=dockerfile
  2. ARG FLAVOR=${TARGETARCH}
  3. ARG ROCMVERSION=6.3.3
  4. ARG JETPACK5VERSION=r35.4.1
  5. ARG JETPACK6VERSION=r36.4.0
  6. ARG CMAKEVERSION=3.31.2
  7. # CUDA v11 requires gcc v10. v10.3 has regressions, so the rockylinux 8.5 AppStream has the latest compatible version
  8. FROM --platform=linux/amd64 rocm/dev-almalinux-8:${ROCMVERSION}-complete AS base-amd64
  9. RUN yum install -y yum-utils \
  10. && yum-config-manager --add-repo https://dl.rockylinux.org/vault/rocky/8.5/AppStream/\$basearch/os/ \
  11. && rpm --import https://dl.rockylinux.org/pub/rocky/RPM-GPG-KEY-Rocky-8 \
  12. && dnf install -y yum-utils ccache gcc-toolset-10-gcc-10.2.1-8.2.el8 gcc-toolset-10-gcc-c++-10.2.1-8.2.el8 gcc-toolset-10-binutils-2.35-11.el8 \
  13. && yum-config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel8/x86_64/cuda-rhel8.repo
  14. ENV PATH=/opt/rh/gcc-toolset-10/root/usr/bin:$PATH
  15. FROM --platform=linux/arm64 almalinux:8 AS base-arm64
  16. # install epel-release for ccache
  17. RUN yum install -y yum-utils epel-release \
  18. && dnf install -y clang ccache \
  19. && yum-config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel8/sbsa/cuda-rhel8.repo
  20. ENV CC=clang CXX=clang++
  21. FROM base-${TARGETARCH} AS base
  22. ARG CMAKEVERSION
  23. RUN curl -fsSL https://github.com/Kitware/CMake/releases/download/v${CMAKEVERSION}/cmake-${CMAKEVERSION}-linux-$(uname -m).tar.gz | tar xz -C /usr/local --strip-components 1
  24. COPY CMakeLists.txt CMakePresets.json .
  25. COPY ml/backend/ggml/ggml ml/backend/ggml/ggml
  26. ENV LDFLAGS=-s
  27. FROM base AS cpu
  28. RUN dnf install -y gcc-toolset-11-gcc gcc-toolset-11-gcc-c++
  29. ENV PATH=/opt/rh/gcc-toolset-11/root/usr/bin:$PATH
  30. RUN --mount=type=cache,target=/root/.ccache \
  31. cmake --preset 'CPU' \
  32. && cmake --build --parallel --preset 'CPU' \
  33. && cmake --install build --component CPU --strip --parallel 8
  34. FROM base AS cuda-11
  35. ARG CUDA11VERSION=11.3
  36. RUN dnf install -y cuda-toolkit-${CUDA11VERSION//./-}
  37. ENV PATH=/usr/local/cuda-11/bin:$PATH
  38. RUN --mount=type=cache,target=/root/.ccache \
  39. cmake --preset 'CUDA 11' \
  40. && cmake --build --parallel --preset 'CUDA 11' \
  41. && cmake --install build --component CUDA --strip --parallel 8
  42. FROM base AS cuda-12
  43. ARG CUDA12VERSION=12.8
  44. RUN dnf install -y cuda-toolkit-${CUDA12VERSION//./-}
  45. ENV PATH=/usr/local/cuda-12/bin:$PATH
  46. RUN --mount=type=cache,target=/root/.ccache \
  47. cmake --preset 'CUDA 12' \
  48. && cmake --build --parallel --preset 'CUDA 12' \
  49. && cmake --install build --component CUDA --strip --parallel 8
  50. FROM base AS rocm-6
  51. ENV PATH=/opt/rocm/hcc/bin:/opt/rocm/hip/bin:/opt/rocm/bin:/opt/rocm/hcc/bin:$PATH
  52. RUN --mount=type=cache,target=/root/.ccache \
  53. cmake --preset 'ROCm 6' \
  54. && cmake --build --parallel --preset 'ROCm 6' \
  55. && cmake --install build --component HIP --strip --parallel 8
  56. FROM --platform=linux/arm64 nvcr.io/nvidia/l4t-jetpack:${JETPACK5VERSION} AS jetpack-5
  57. ARG CMAKEVERSION
  58. RUN apt-get update && apt-get install -y curl ccache \
  59. && curl -fsSL https://github.com/Kitware/CMake/releases/download/v${CMAKEVERSION}/cmake-${CMAKEVERSION}-linux-$(uname -m).tar.gz | tar xz -C /usr/local --strip-components 1
  60. COPY CMakeLists.txt CMakePresets.json .
  61. COPY ml/backend/ggml/ggml ml/backend/ggml/ggml
  62. RUN --mount=type=cache,target=/root/.ccache \
  63. cmake --preset 'JetPack 5' \
  64. && cmake --build --parallel --preset 'JetPack 5' \
  65. && cmake --install build --component CUDA --strip --parallel 8
  66. FROM --platform=linux/arm64 nvcr.io/nvidia/l4t-jetpack:${JETPACK6VERSION} AS jetpack-6
  67. ARG CMAKEVERSION
  68. RUN apt-get update && apt-get install -y curl ccache \
  69. && curl -fsSL https://github.com/Kitware/CMake/releases/download/v${CMAKEVERSION}/cmake-${CMAKEVERSION}-linux-$(uname -m).tar.gz | tar xz -C /usr/local --strip-components 1
  70. COPY CMakeLists.txt CMakePresets.json .
  71. COPY ml/backend/ggml/ggml ml/backend/ggml/ggml
  72. RUN --mount=type=cache,target=/root/.ccache \
  73. cmake --preset 'JetPack 6' \
  74. && cmake --build --parallel --preset 'JetPack 6' \
  75. && cmake --install build --component CUDA --strip --parallel 8
  76. FROM base AS build
  77. WORKDIR /go/src/github.com/ollama/ollama
  78. COPY go.mod go.sum .
  79. RUN curl -fsSL https://golang.org/dl/go$(awk '/^go/ { print $2 }' go.mod).linux-$(case $(uname -m) in x86_64) echo amd64 ;; aarch64) echo arm64 ;; esac).tar.gz | tar xz -C /usr/local
  80. ENV PATH=/usr/local/go/bin:$PATH
  81. RUN go mod download
  82. COPY . .
  83. ARG GOFLAGS="'-ldflags=-w -s'"
  84. ENV CGO_ENABLED=1
  85. RUN --mount=type=cache,target=/root/.cache/go-build \
  86. go build -trimpath -buildmode=pie -o /bin/ollama .
  87. FROM --platform=linux/amd64 scratch AS amd64
  88. COPY --from=cuda-11 dist/lib/ollama/cuda_v11 /lib/ollama/cuda_v11
  89. COPY --from=cuda-12 dist/lib/ollama/cuda_v12 /lib/ollama/cuda_v12
  90. FROM --platform=linux/arm64 scratch AS arm64
  91. COPY --from=cuda-11 dist/lib/ollama/cuda_v11 /lib/ollama/cuda_v11
  92. COPY --from=cuda-12 dist/lib/ollama/cuda_v12 /lib/ollama/cuda_v12
  93. COPY --from=jetpack-5 dist/lib/ollama/cuda_v11 lib/ollama/cuda_jetpack5
  94. COPY --from=jetpack-6 dist/lib/ollama/cuda_v12 lib/ollama/cuda_jetpack6
  95. FROM scratch AS rocm
  96. COPY --from=rocm-6 dist/lib/ollama/rocm /lib/ollama/rocm
  97. FROM ${FLAVOR} AS archive
  98. COPY --from=cpu dist/lib/ollama /lib/ollama
  99. COPY --from=build /bin/ollama /bin/ollama
  100. FROM ubuntu:20.04
  101. RUN apt-get update \
  102. && apt-get install -y ca-certificates \
  103. && apt-get clean \
  104. && rm -rf /var/lib/apt/lists/*
  105. COPY --from=archive /bin /usr/bin
  106. ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  107. COPY --from=archive /lib/ollama /usr/lib/ollama
  108. ENV LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64
  109. ENV NVIDIA_DRIVER_CAPABILITIES=compute,utility
  110. ENV NVIDIA_VISIBLE_DEVICES=all
  111. ENV OLLAMA_HOST=0.0.0.0:11434
  112. EXPOSE 11434
  113. ENTRYPOINT ["/bin/ollama"]
  114. CMD ["serve"]