Dockerfile 11 KB

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