Dockerfile 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  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. ARG CUSTOM_CPU_FLAGS
  68. RUN --mount=type=cache,target=/root/.ccache \
  69. if grep "^flags" /proc/cpuinfo|grep avx>/dev/null; then \
  70. make -j $(nproc) dist ; \
  71. else \
  72. make -j 5 dist ; \
  73. fi
  74. RUN cd dist/linux-$GOARCH && \
  75. tar -cf - . | pigz --best > ../ollama-linux-$GOARCH.tgz
  76. RUN if [ -z ${OLLAMA_SKIP_ROCM_GENERATE} ] ; then \
  77. cd dist/linux-$GOARCH-rocm && \
  78. tar -cf - . | pigz --best > ../ollama-linux-$GOARCH-rocm.tgz ;\
  79. fi
  80. # Jetsons need to be built in discrete stages
  81. FROM --platform=linux/arm64 nvcr.io/nvidia/l4t-jetpack:${JETPACK_5} AS runners-jetpack5-arm64
  82. ARG GOLANG_VERSION
  83. RUN apt-get update && apt-get install -y git curl ccache && \
  84. curl -s -L https://dl.google.com/go/go${GOLANG_VERSION}.linux-arm64.tar.gz | tar xz -C /usr/local && \
  85. ln -s /usr/local/go/bin/go /usr/local/bin/go && \
  86. ln -s /usr/local/go/bin/gofmt /usr/local/bin/gofmt && \
  87. apt-get clean && rm -rf /var/lib/apt/lists/*
  88. WORKDIR /go/src/github.com/ollama/ollama/
  89. COPY . .
  90. ARG CGO_CFLAGS
  91. ENV GOARCH arm64
  92. ARG VERSION
  93. RUN --mount=type=cache,target=/root/.ccache \
  94. make -j 5 dist_cuda_v11 \
  95. CUDA_ARCHITECTURES="72;87" \
  96. GPU_RUNNER_VARIANT=_jetpack5 \
  97. DIST_LIB_DIR=/go/src/github.com/ollama/ollama/dist/linux-arm64-jetpack5/lib/ollama \
  98. DIST_GPU_RUNNER_DEPS_DIR=/go/src/github.com/ollama/ollama/dist/linux-arm64-jetpack5/lib/ollama/cuda_jetpack5
  99. FROM --platform=linux/arm64 nvcr.io/nvidia/l4t-jetpack:${JETPACK_6} AS runners-jetpack6-arm64
  100. ARG GOLANG_VERSION
  101. RUN apt-get update && apt-get install -y git curl ccache && \
  102. curl -s -L https://dl.google.com/go/go${GOLANG_VERSION}.linux-arm64.tar.gz | tar xz -C /usr/local && \
  103. ln -s /usr/local/go/bin/go /usr/local/bin/go && \
  104. ln -s /usr/local/go/bin/gofmt /usr/local/bin/gofmt && \
  105. apt-get clean && rm -rf /var/lib/apt/lists/*
  106. WORKDIR /go/src/github.com/ollama/ollama/
  107. COPY . .
  108. ARG CGO_CFLAGS
  109. ENV GOARCH arm64
  110. ARG VERSION
  111. RUN --mount=type=cache,target=/root/.ccache \
  112. make -j 5 dist_cuda_v12 \
  113. CUDA_ARCHITECTURES="87" \
  114. GPU_RUNNER_VARIANT=_jetpack6 \
  115. DIST_LIB_DIR=/go/src/github.com/ollama/ollama/dist/linux-arm64-jetpack6/lib/ollama \
  116. DIST_GPU_RUNNER_DEPS_DIR=/go/src/github.com/ollama/ollama/dist/linux-arm64-jetpack6/lib/ollama/cuda_jetpack6
  117. FROM --platform=linux/arm64 unified-builder-arm64 AS build-arm64
  118. COPY . .
  119. ARG OLLAMA_SKIP_CUDA_GENERATE
  120. ARG OLLAMA_FAST_BUILD
  121. ARG VERSION
  122. RUN --mount=type=cache,target=/root/.ccache \
  123. make -j 5 dist
  124. COPY --from=runners-jetpack5-arm64 /go/src/github.com/ollama/ollama/dist/ dist/
  125. COPY --from=runners-jetpack6-arm64 /go/src/github.com/ollama/ollama/dist/ dist/
  126. RUN cd dist/linux-$GOARCH && \
  127. tar -cf - . | pigz --best > ../ollama-linux-$GOARCH.tgz
  128. RUN cd dist/linux-$GOARCH-jetpack5 && \
  129. tar -cf - . | pigz --best > ../ollama-linux-$GOARCH-jetpack5.tgz
  130. RUN cd dist/linux-$GOARCH-jetpack6 && \
  131. tar -cf - . | pigz --best > ../ollama-linux-$GOARCH-jetpack6.tgz
  132. FROM --platform=linux/amd64 scratch AS dist-amd64
  133. COPY --from=build-amd64 /go/src/github.com/ollama/ollama/dist/ollama-linux-*.tgz /
  134. FROM --platform=linux/arm64 scratch AS dist-arm64
  135. COPY --from=build-arm64 /go/src/github.com/ollama/ollama/dist/ollama-linux-*.tgz /
  136. FROM dist-$TARGETARCH AS dist
  137. # For amd64 container images, filter out cuda/rocm to minimize size
  138. FROM build-amd64 AS runners-cuda-amd64
  139. RUN rm -rf \
  140. ./dist/linux-amd64/lib/ollama/libggml_hipblas.so \
  141. ./dist/linux-amd64/lib/ollama/runners/rocm*
  142. FROM build-amd64 AS runners-rocm-amd64
  143. RUN rm -rf \
  144. ./dist/linux-amd64/lib/ollama/libggml_cuda*.so \
  145. ./dist/linux-amd64/lib/ollama/libcu*.so* \
  146. ./dist/linux-amd64/lib/ollama/runners/cuda*
  147. FROM --platform=linux/amd64 ubuntu:22.04 AS runtime-amd64
  148. RUN apt-get update && \
  149. apt-get install -y ca-certificates && \
  150. apt-get clean && rm -rf /var/lib/apt/lists/*
  151. COPY --from=build-amd64 /go/src/github.com/ollama/ollama/dist/linux-amd64/bin/ /bin/
  152. COPY --from=runners-cuda-amd64 /go/src/github.com/ollama/ollama/dist/linux-amd64/lib/ /lib/
  153. FROM --platform=linux/arm64 ubuntu:22.04 AS runtime-arm64
  154. RUN apt-get update && \
  155. apt-get install -y ca-certificates && \
  156. apt-get clean && rm -rf /var/lib/apt/lists/*
  157. COPY --from=build-arm64 /go/src/github.com/ollama/ollama/dist/linux-arm64/bin/ /bin/
  158. COPY --from=build-arm64 /go/src/github.com/ollama/ollama/dist/linux-arm64/lib/ /lib/
  159. COPY --from=runners-jetpack5-arm64 /go/src/github.com/ollama/ollama/dist/linux-arm64-jetpack5/lib/ /lib/
  160. COPY --from=runners-jetpack6-arm64 /go/src/github.com/ollama/ollama/dist/linux-arm64-jetpack6/lib/ /lib/
  161. # ROCm libraries larger so we keep it distinct from the CPU/CUDA image
  162. FROM --platform=linux/amd64 ubuntu:22.04 AS runtime-rocm
  163. # Frontload the rocm libraries which are large, and rarely change to increase chance of a common layer
  164. # across releases
  165. COPY --from=build-amd64 /go/src/github.com/ollama/ollama/dist/linux-amd64-rocm/lib/ /lib/
  166. RUN apt-get update && \
  167. apt-get install -y ca-certificates && \
  168. apt-get clean && rm -rf /var/lib/apt/lists/*
  169. COPY --from=build-amd64 /go/src/github.com/ollama/ollama/dist/linux-amd64/bin/ /bin/
  170. COPY --from=runners-rocm-amd64 /go/src/github.com/ollama/ollama/dist/linux-amd64/lib/ /lib/
  171. EXPOSE 11434
  172. ENV OLLAMA_HOST 0.0.0.0
  173. ENTRYPOINT ["/bin/ollama"]
  174. CMD ["serve"]
  175. FROM runtime-$TARGETARCH
  176. EXPOSE 11434
  177. ENV OLLAMA_HOST 0.0.0.0
  178. ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  179. ENV LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64
  180. ENV NVIDIA_DRIVER_CAPABILITIES=compute,utility
  181. ENV NVIDIA_VISIBLE_DEVICES=all
  182. ENTRYPOINT ["/bin/ollama"]
  183. CMD ["serve"]