Dockerfile 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. ARG GOLANG_VERSION=1.22.8
  2. ARG CUDA_VERSION_11=11.3.1
  3. ARG CUDA_VERSION_12=12.4.0
  4. ARG ROCM_VERSION=6.1.2
  5. ARG JETPACK_6=r36.2.0
  6. ARG JETPACK_5=r35.4.1
  7. ### To create a local image for building linux binaries on mac or windows with efficient incremental builds
  8. #
  9. # docker build --platform linux/amd64 -t builder-amd64 -f Dockerfile --target unified-builder-amd64 .
  10. # docker run --platform linux/amd64 --rm -it -v $(pwd):/go/src/github.com/ollama/ollama/ builder-amd64
  11. #
  12. ### Then incremental builds will be much faster in this container
  13. #
  14. # make -j 10 dist
  15. #
  16. FROM --platform=linux/amd64 rocm/dev-centos-7:${ROCM_VERSION}-complete AS unified-builder-amd64
  17. ARG GOLANG_VERSION
  18. ARG CUDA_VERSION_11
  19. ARG CUDA_VERSION_12
  20. COPY ./scripts/rh_linux_deps.sh /
  21. ENV PATH /opt/rh/devtoolset-10/root/usr/bin:/usr/local/cuda/bin:$PATH
  22. ENV LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda/lib64
  23. RUN GOLANG_VERSION=${GOLANG_VERSION} sh /rh_linux_deps.sh
  24. RUN yum-config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/cuda-rhel7.repo && \
  25. dnf clean all && \
  26. dnf install -y \
  27. zsh \
  28. cuda-toolkit-$(echo ${CUDA_VERSION_11} | cut -f1-2 -d. | sed -e "s/\./-/g") \
  29. cuda-toolkit-$(echo ${CUDA_VERSION_12} | cut -f1-2 -d. | sed -e "s/\./-/g")
  30. # TODO intel oneapi goes here...
  31. ENV GOARCH amd64
  32. ENV CGO_ENABLED 1
  33. WORKDIR /go/src/github.com/ollama/ollama/
  34. ENTRYPOINT [ "zsh" ]
  35. ### To create a local image for building linux binaries on mac or linux/arm64 with efficient incremental builds
  36. # Note: this does not contain jetson variants
  37. #
  38. # docker build --platform linux/arm64 -t builder-arm64 -f Dockerfile --target unified-builder-arm64 .
  39. # docker run --platform linux/arm64 --rm -it -v $(pwd):/go/src/github.com/ollama/ollama/ builder-arm64
  40. #
  41. FROM --platform=linux/arm64 rockylinux:8 AS unified-builder-arm64
  42. ARG GOLANG_VERSION
  43. ARG CUDA_VERSION_11
  44. ARG CUDA_VERSION_12
  45. COPY ./scripts/rh_linux_deps.sh /
  46. RUN GOLANG_VERSION=${GOLANG_VERSION} sh /rh_linux_deps.sh
  47. RUN yum-config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel8/sbsa/cuda-rhel8.repo && \
  48. dnf config-manager --set-enabled appstream && \
  49. dnf clean all && \
  50. dnf install -y \
  51. zsh \
  52. cuda-toolkit-$(echo ${CUDA_VERSION_11} | cut -f1-2 -d. | sed -e "s/\./-/g") \
  53. cuda-toolkit-$(echo ${CUDA_VERSION_12} | cut -f1-2 -d. | sed -e "s/\./-/g")
  54. ENV PATH /opt/rh/gcc-toolset-10/root/usr/bin:$PATH:/usr/local/cuda/bin
  55. ENV LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda/lib64
  56. ENV LIBRARY_PATH=/usr/local/cuda/lib64/stubs:/opt/amdgpu/lib64
  57. ENV GOARCH arm64
  58. ENV CGO_ENABLED 1
  59. WORKDIR /go/src/github.com/ollama/ollama/
  60. ENTRYPOINT [ "zsh" ]
  61. FROM --platform=linux/amd64 unified-builder-amd64 AS build-amd64
  62. COPY . .
  63. ARG OLLAMA_SKIP_CUDA_GENERATE
  64. ARG OLLAMA_SKIP_ROCM_GENERATE
  65. ARG OLLAMA_FAST_BUILD
  66. ARG VERSION
  67. RUN --mount=type=cache,target=/root/.ccache \
  68. if grep "^flags" /proc/cpuinfo|grep avx>/dev/null; then \
  69. make -j $(expr $(nproc) / 2 ) dist ; \
  70. else \
  71. make -j 5 dist ; \
  72. fi
  73. RUN cd dist/linux-$GOARCH && \
  74. tar -cf - . | pigz --best > ../ollama-linux-$GOARCH.tgz
  75. RUN if [ -z ${OLLAMA_SKIP_ROCM_GENERATE} ] ; then \
  76. cd dist/linux-$GOARCH-rocm && \
  77. tar -cf - . | pigz --best > ../ollama-linux-$GOARCH-rocm.tgz ;\
  78. fi
  79. # Jetsons need to be built in discrete stages
  80. FROM --platform=linux/arm64 nvcr.io/nvidia/l4t-jetpack:${JETPACK_5} AS runners-jetpack5-arm64
  81. ARG GOLANG_VERSION
  82. RUN apt-get update && apt-get install -y git curl ccache && \
  83. curl -s -L https://dl.google.com/go/go${GOLANG_VERSION}.linux-arm64.tar.gz | tar xz -C /usr/local && \
  84. ln -s /usr/local/go/bin/go /usr/local/bin/go && \
  85. ln -s /usr/local/go/bin/gofmt /usr/local/bin/gofmt && \
  86. apt-get clean && rm -rf /var/lib/apt/lists/*
  87. WORKDIR /go/src/github.com/ollama/ollama/
  88. COPY . .
  89. ARG CGO_CFLAGS
  90. ENV GOARCH arm64
  91. ARG VERSION
  92. RUN --mount=type=cache,target=/root/.ccache \
  93. make -j 5 dist_cuda_v11 \
  94. CUDA_ARCHITECTURES="72;87" \
  95. GPU_RUNNER_VARIANT=_jetpack5 \
  96. DIST_LIB_DIR=/go/src/github.com/ollama/ollama/dist/linux-arm64-jetpack5/lib/ollama \
  97. DIST_GPU_RUNNER_DEPS_DIR=/go/src/github.com/ollama/ollama/dist/linux-arm64-jetpack5/lib/ollama/cuda_jetpack5
  98. FROM --platform=linux/arm64 nvcr.io/nvidia/l4t-jetpack:${JETPACK_6} AS runners-jetpack6-arm64
  99. ARG GOLANG_VERSION
  100. RUN apt-get update && apt-get install -y git curl ccache && \
  101. curl -s -L https://dl.google.com/go/go${GOLANG_VERSION}.linux-arm64.tar.gz | tar xz -C /usr/local && \
  102. ln -s /usr/local/go/bin/go /usr/local/bin/go && \
  103. ln -s /usr/local/go/bin/gofmt /usr/local/bin/gofmt && \
  104. apt-get clean && rm -rf /var/lib/apt/lists/*
  105. WORKDIR /go/src/github.com/ollama/ollama/
  106. COPY . .
  107. ARG CGO_CFLAGS
  108. ENV GOARCH arm64
  109. ARG VERSION
  110. RUN --mount=type=cache,target=/root/.ccache \
  111. make -j 5 dist_cuda_v12 \
  112. CUDA_ARCHITECTURES="87" \
  113. GPU_RUNNER_VARIANT=_jetpack6 \
  114. DIST_LIB_DIR=/go/src/github.com/ollama/ollama/dist/linux-arm64-jetpack6/lib/ollama \
  115. DIST_GPU_RUNNER_DEPS_DIR=/go/src/github.com/ollama/ollama/dist/linux-arm64-jetpack6/lib/ollama/cuda_jetpack6
  116. FROM --platform=linux/arm64 unified-builder-arm64 AS build-arm64
  117. COPY . .
  118. ARG OLLAMA_SKIP_CUDA_GENERATE
  119. ARG OLLAMA_FAST_BUILD
  120. ARG VERSION
  121. RUN --mount=type=cache,target=/root/.ccache \
  122. make -j 5 dist
  123. COPY --from=runners-jetpack5-arm64 /go/src/github.com/ollama/ollama/dist/ dist/
  124. COPY --from=runners-jetpack6-arm64 /go/src/github.com/ollama/ollama/dist/ dist/
  125. RUN cd dist/linux-$GOARCH && \
  126. tar -cf - . | pigz --best > ../ollama-linux-$GOARCH.tgz
  127. RUN cd dist/linux-$GOARCH-jetpack5 && \
  128. tar -cf - . | pigz --best > ../ollama-linux-$GOARCH-jetpack5.tgz
  129. RUN cd dist/linux-$GOARCH-jetpack6 && \
  130. tar -cf - . | pigz --best > ../ollama-linux-$GOARCH-jetpack6.tgz
  131. FROM --platform=linux/amd64 scratch AS dist-amd64
  132. COPY --from=build-amd64 /go/src/github.com/ollama/ollama/dist/ollama-linux-*.tgz /
  133. FROM --platform=linux/arm64 scratch AS dist-arm64
  134. COPY --from=build-arm64 /go/src/github.com/ollama/ollama/dist/ollama-linux-*.tgz /
  135. FROM dist-$TARGETARCH AS dist
  136. # For amd64 container images, filter out cuda/rocm to minimize size
  137. FROM build-amd64 AS runners-cuda-amd64
  138. RUN rm -rf \
  139. ./dist/linux-amd64/lib/ollama/libggml_hipblas.so \
  140. ./dist/linux-amd64/lib/ollama/runners/rocm*
  141. FROM build-amd64 AS runners-rocm-amd64
  142. RUN rm -rf \
  143. ./dist/linux-amd64/lib/ollama/libggml_cuda*.so \
  144. ./dist/linux-amd64/lib/ollama/libcu*.so* \
  145. ./dist/linux-amd64/lib/ollama/runners/cuda*
  146. FROM --platform=linux/amd64 ubuntu:22.04 AS runtime-amd64
  147. RUN apt-get update && \
  148. apt-get install -y ca-certificates && \
  149. apt-get clean && rm -rf /var/lib/apt/lists/*
  150. COPY --from=build-amd64 /go/src/github.com/ollama/ollama/dist/linux-amd64/bin/ /bin/
  151. COPY --from=runners-cuda-amd64 /go/src/github.com/ollama/ollama/dist/linux-amd64/lib/ /lib/
  152. FROM --platform=linux/arm64 ubuntu:22.04 AS runtime-arm64
  153. RUN apt-get update && \
  154. apt-get install -y ca-certificates && \
  155. apt-get clean && rm -rf /var/lib/apt/lists/*
  156. COPY --from=build-arm64 /go/src/github.com/ollama/ollama/dist/linux-arm64/bin/ /bin/
  157. COPY --from=build-arm64 /go/src/github.com/ollama/ollama/dist/linux-arm64/lib/ /lib/
  158. COPY --from=runners-jetpack5-arm64 /go/src/github.com/ollama/ollama/dist/linux-arm64-jetpack5/lib/ /lib/
  159. COPY --from=runners-jetpack6-arm64 /go/src/github.com/ollama/ollama/dist/linux-arm64-jetpack6/lib/ /lib/
  160. # ROCm libraries larger so we keep it distinct from the CPU/CUDA image
  161. FROM --platform=linux/amd64 ubuntu:22.04 AS runtime-rocm
  162. # Frontload the rocm libraries which are large, and rarely change to increase chance of a common layer
  163. # across releases
  164. COPY --from=build-amd64 /go/src/github.com/ollama/ollama/dist/linux-amd64-rocm/lib/ /lib/
  165. RUN apt-get update && \
  166. apt-get install -y ca-certificates && \
  167. apt-get clean && rm -rf /var/lib/apt/lists/*
  168. COPY --from=build-amd64 /go/src/github.com/ollama/ollama/dist/linux-amd64/bin/ /bin/
  169. COPY --from=runners-rocm-amd64 /go/src/github.com/ollama/ollama/dist/linux-amd64/lib/ /lib/
  170. EXPOSE 11434
  171. ENV OLLAMA_HOST 0.0.0.0
  172. ENTRYPOINT ["/bin/ollama"]
  173. CMD ["serve"]
  174. FROM runtime-$TARGETARCH
  175. EXPOSE 11434
  176. ENV OLLAMA_HOST 0.0.0.0
  177. ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  178. ENV LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64
  179. ENV NVIDIA_DRIVER_CAPABILITIES=compute,utility
  180. ENV NVIDIA_VISIBLE_DEVICES=all
  181. ENTRYPOINT ["/bin/ollama"]
  182. CMD ["serve"]