Dockerfile 8.2 KB

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