From cb3d88bdcc29b4764e4be9e3c6fd69714b48b2f2 Mon Sep 17 00:00:00 2001 From: nrvo <151435968+nrvo@users.noreply.github.com> Date: Sat, 4 May 2024 16:31:09 +0200 Subject: [PATCH 1/6] [App] Ollama Nvidia --- apps/ollama-nvidia/config.json | 18 ++++ apps/ollama-nvidia/docker-compose.yml | 48 +++++++++ apps/ollama-nvidia/metadata/description.md | 108 +++++++++++++++++++++ apps/ollama-nvidia/metadata/logo.jpg | Bin 0 -> 33104 bytes 4 files changed, 174 insertions(+) create mode 100755 apps/ollama-nvidia/config.json create mode 100755 apps/ollama-nvidia/docker-compose.yml create mode 100755 apps/ollama-nvidia/metadata/description.md create mode 100755 apps/ollama-nvidia/metadata/logo.jpg diff --git a/apps/ollama-nvidia/config.json b/apps/ollama-nvidia/config.json new file mode 100755 index 00000000..baf4214b --- /dev/null +++ b/apps/ollama-nvidia/config.json @@ -0,0 +1,18 @@ +{ + "$schema": "../schema.json", + "name": "Ollama - Nvidia", + "available": true, + "exposable": true, + "port": 11435, + "id": "ollama-nvidia", + "tipi_version": 1, + "version": "0.1.32", + "categories": ["ai"], + "description": "Get up and running with Llama 3, Mistral, Gemma, and other large language models.", + "short_desc": "LLMs inference server with OpenAI compatible API", + "author": "ollama", + "source": "https://github.com/ollama/ollama", + "website": "https://ollama.com", + "form_fields": [], + "supported_architectures": ["arm64", "amd64"] +} diff --git a/apps/ollama-nvidia/docker-compose.yml b/apps/ollama-nvidia/docker-compose.yml new file mode 100755 index 00000000..153fdcbf --- /dev/null +++ b/apps/ollama-nvidia/docker-compose.yml @@ -0,0 +1,48 @@ +version: '3.7' + +services: + ollama-nvidia: + image: ollama/ollama + restart: unless-stopped + container_name: ollama-nvidia + environment: + - PORT=11435 + ports: + - '${APP_PORT}:11435' + networks: + - tipi_main_network + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: all + capabilities: + - gpu + volumes: + - ${APP_DATA_DIR}/.ollama:/root/.ollama + labels: + # Main + traefik.enable: true + traefik.http.middlewares.ollama-nvidia-web-redirect.redirectscheme.scheme: https + traefik.http.services.ollama-nvidia.loadbalancer.server.port: 11435 + # Web + traefik.http.routers.ollama-nvidia-insecure.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.ollama-nvidia-insecure.entrypoints: web + traefik.http.routers.ollama-nvidia-insecure.service: ollama-nvidia + traefik.http.routers.ollama-nvidia-insecure.middlewares: ollama-nvidia-web-redirect + # Websecure + traefik.http.routers.ollama-nvidia.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.ollama-nvidia.entrypoints: websecure + traefik.http.routers.ollama-nvidia.service: ollama-nvidia + traefik.http.routers.ollama-nvidia.tls.certresolver: myresolver + # Local domain + traefik.http.routers.ollama-nvidia-local-insecure.rule: Host(`ollama-nvidia.${LOCAL_DOMAIN}`) + traefik.http.routers.ollama-nvidia-local-insecure.entrypoints: web + traefik.http.routers.ollama-nvidia-local-insecure.service: ollama-nvidia + traefik.http.routers.ollama-nvidia-local-insecure.middlewares: ollama-nvidia-web-redirect + # Local domain secure + traefik.http.routers.ollama-nvidia-local.rule: Host(`ollama-nvidia.${LOCAL_DOMAIN}`) + traefik.http.routers.ollama-nvidia-local.entrypoints: websecure + traefik.http.routers.ollama-nvidia-local.service: ollama-nvidia + traefik.http.routers.ollama-nvidia-local.tls: true diff --git a/apps/ollama-nvidia/metadata/description.md b/apps/ollama-nvidia/metadata/description.md new file mode 100755 index 00000000..369a19cf --- /dev/null +++ b/apps/ollama-nvidia/metadata/description.md @@ -0,0 +1,108 @@ +# Ollama - Nvidia +[Ollama](https://github.com/ollama/ollama) allows you to run open-source large language models, such as Llama 3 & , locally. Ollama bundles model weights, configuration, and data into a single package, defined by a Modelfile. + +--- + +## Nvidia Instructions +To enable your Nvidia GPU in Docker : +- You need to install the [NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#installation) + +- And configure Docker to use Nvidia driver +```sh +sudo nvidia-ctk runtime configure --runtime=docker +sudo systemctl restart docker +``` +--- + +## Usage + +### Use with a frontend +- [LobeChat](https://github.com/lobehub/lobe-chat) +- [LibreChat](https://github.com/danny-avila/LibreChat) +- [OpenWebUI](https://github.com/open-webui/open-webui) +- [And more ...](https://github.com/ollama/ollama) + +--- + +### Try the REST API +Ollama has a REST API for running and managing models. + +**Generate a response** +```sh +curl http://localhost:11434/api/generate -d '{ + "model": "llama3", + "prompt":"Why is the sky blue?" +}' +``` + +**Chat with a model** +```sh +curl http://localhost:11434/api/chat -d '{ + "model": "llama3", + "messages": [ + { "role": "user", "content": "why is the sky blue?" } + ] +}' +``` +--- + +### Try in terminal +```sh +docker exec -it ollama-nvidia ollama run llama3 --verbose +``` + +--- + +## Compatible GPUs +Ollama supports Nvidia GPUs with compute capability 5.0+. + +Check your compute compatibility to see if your card is supported: +[https://developer.nvidia.com/cuda-gpus](https://developer.nvidia.com/cuda-gpus) + +| Compute Capability | Family | Cards | +| ------------------ | ------------------- | ----------------------------------------------------------------------------------------------------------- | +| 9.0 | NVIDIA | `H100` | +| 8.9 | GeForce RTX 40xx | `RTX 4090` `RTX 4080` `RTX 4070 Ti` `RTX 4060 Ti` | +| | NVIDIA Professional | `L4` `L40` `RTX 6000` | +| 8.6 | GeForce RTX 30xx | `RTX 3090 Ti` `RTX 3090` `RTX 3080 Ti` `RTX 3080` `RTX 3070 Ti` `RTX 3070` `RTX 3060 Ti` `RTX 3060` | +| | NVIDIA Professional | `A40` `RTX A6000` `RTX A5000` `RTX A4000` `RTX A3000` `RTX A2000` `A10` `A16` `A2` | +| 8.0 | NVIDIA | `A100` `A30` | +| 7.5 | GeForce GTX/RTX | `GTX 1650 Ti` `TITAN RTX` `RTX 2080 Ti` `RTX 2080` `RTX 2070` `RTX 2060` | +| | NVIDIA Professional | `T4` `RTX 5000` `RTX 4000` `RTX 3000` `T2000` `T1200` `T1000` `T600` `T500` | +| | Quadro | `RTX 8000` `RTX 6000` `RTX 5000` `RTX 4000` | +| 7.0 | NVIDIA | `TITAN V` `V100` `Quadro GV100` | +| 6.1 | NVIDIA TITAN | `TITAN Xp` `TITAN X` | +| | GeForce GTX | `GTX 1080 Ti` `GTX 1080` `GTX 1070 Ti` `GTX 1070` `GTX 1060` `GTX 1050` | +| | Quadro | `P6000` `P5200` `P4200` `P3200` `P5000` `P4000` `P3000` `P2200` `P2000` `P1000` `P620` `P600` `P500` `P520` | +| | Tesla | `P40` `P4` | +| 6.0 | NVIDIA | `Tesla P100` `Quadro GP100` | +| 5.2 | GeForce GTX | `GTX TITAN X` `GTX 980 Ti` `GTX 980` `GTX 970` `GTX 960` `GTX 950` | +| | Quadro | `M6000 24GB` `M6000` `M5000` `M5500M` `M4000` `M2200` `M2000` `M620` | +| | Tesla | `M60` `M40` | +| 5.0 | GeForce GTX | `GTX 750 Ti` `GTX 750` `NVS 810` | +| | Quadro | `K2200` `K1200` `K620` `M1200` `M520` `M5000M` `M4000M` `M3000M` `M2000M` `M1000M` `K620M` `M600M` `M500M` | + + +--- + +## Model library +Ollama supports a list of models available on [ollama.com/library](https://ollama.com/library 'ollama model library') + +Here are some example models that can be downloaded: + +| Model | Parameters | Size | Download | +| ------------------ | ---------- | ----- | ------------------------------ | +| Llama 3 | 8B | 4.7GB | `ollama run llama3` | +| Llama 3 | 70B | 40GB | `ollama run llama3:70b` | +| Phi-3 | 3,8B | 2.3GB | `ollama run phi3` | +| Mistral | 7B | 4.1GB | `ollama run mistral` | +| Neural Chat | 7B | 4.1GB | `ollama run neural-chat` | +| Starling | 7B | 4.1GB | `ollama run starling-lm` | +| Code Llama | 7B | 3.8GB | `ollama run codellama` | +| Llama 2 Uncensored | 7B | 3.8GB | `ollama run llama2-uncensored` | +| LLaVA | 7B | 4.5GB | `ollama run llava` | +| Gemma | 2B | 1.4GB | `ollama run gemma:2b` | +| Gemma | 7B | 4.8GB | `ollama run gemma:7b` | +| Solar | 10.7B | 6.1GB | `ollama run solar` | + +> Note: You should have at least 8 GB of RAM available to run the 7B models, 16 GB to run the 13B models, and 32 GB to run the 33B models. \ No newline at end of file diff --git a/apps/ollama-nvidia/metadata/logo.jpg b/apps/ollama-nvidia/metadata/logo.jpg new file mode 100755 index 0000000000000000000000000000000000000000..5e8051d838ed119270db3a14a73021d0388f3ceb GIT binary patch literal 33104 zcmd42cU)87mNy)F6{L596hV3wqy-C2LiVtKq2*S_fP`&D1m@8=p1msD3t%| za{~QrN{;^+C)y1}{cqz`13&*XBj5nu@VB3roxLBph}?SQ?dSdUk++YCvYNb#h?MDl zCpWJ@S1y1+%8JUWnu=a^_YEU-SfAsTc|Lq=N;6Lpjz8Q3i0XhH2d{yKXK^j+# zO{xD-2?EIqQrLs21SAXv0nSi@Cc%82v$bO!ViMDbUnqyUJaq@<*xrUDu@4fUT!Lre2lqy4u= z_gAC;(-{8V{yYvmNDcgFprxVx`}O~E=X4I>j>u^Xh>ac~21G?63Zi7Apkkvq?V!j3 zR*~j!GyIDL-~`MQm>3;B10&N}5G4f_6(uzl4KQEeFJXTcgqn?p{hZQeS`PF3bfUhT z$}f^X(TiQFXyvjP!iuXrcoNRQ$j!sc$1ibSQtE=Vs@g?$jZ2zWujv~Y8W~@|ZE0m~ zV{2#cf1j<}vdBV;&b~z+PK|&+x@B1+!#toyqyYmJ!K!eEXT8@RjPFYDXuEu7~1 zdNiEo|MUQ#j{eW4U(s}RNrY=)ge8p8}BjumllZ@GcY6ZT& z-fmupHeMC_>}i2dxU4LlQ=Wl9J^Nh5=cl07n<#XS<^)D*SpX3UJ>zu)%(@?2!P1Vv zT*^HKr4>aJ_vpwv%i0ttBYVnQq`h?#TK;}_aNXFW=IfkWn`TEg*BX2Fp*qPJ=U`b} zO|V#wL)8{^hK|hSS?J)d?np;U@qA!(_Ob4{=J+4M49x2G_O)D`Lix@a;-{bi*?SX9 z;12I;BtDvegzJ7<-r@7$&$!td*B7D~;|T(N>FQy8fmlqi8E}59m675mL#o5Bwcg}k zyrcTanPA(QUpjr$d)$FoZIWZSWd}2jYU`9XKLx1_ReQ(7Ika_P>7V0~o7Qz~q^WaF z^@-6#Df(hqwPU#xEqE&w;*JVG3^;}-sIe`3vP)QAeAX(bXhjX%JmC3hz40Ube)r9T zBSZZ#LoOd-)6DzxJnHRNO2NkZTF-Pw_N-kE6etXug55h+PDV+osK;61@S3$q=Ls0E z9W*O&SSsc56Z6~-Kczpp_>JCD9nfSy;kF?f|9)Xp2PTQh0n3SAD)6PEZyV_GQ_xr zg42jpThdZFs5sW-f4Z5msA)Ppf}nq*6vSc{1L3JrtEd@B^QL4~{L}TV1t&!1NAD-jAb<{o-*)=wQ|DC!S zjpE;*ef$l)U849%D{ycC{ALlS zv|1vNwT{3pEZID7Rv^fCFM->2tQYKt{5j`n#;UxoCh-}ebBm7bcxf#Z^~!&tVvv(` zcnoe}D+G65r_0o^O|$xYL)ZJP<|c*ddvq_Jo;~@dJtph`r!d2qwdu-Y*AUur1wj+7 zhrSCN_GL|h)@e$Dd0%=PlcN`B>aL%HILRqs!^f_a4`q@Y-d)dX&$1%*IA9b~QpW82 z6~3zwqk^PAF5yo>VmW}qJSsfG=EO+>y7M0%RHtMA105$FRaERYEu8kWY;!k8PIf7H zExDdS(A{qGgodk(k)uRo_;dMuEX>Hw&u}S_$Q_Muc)jS|&IF%oZ%sR=2IslrGIpJ` zUR}DiTQ5@7=wnlGocDUvX7}ax@TKGHOHCKXzDO2O6e0<{25Z|!OoP}a#zOk z%eMxD$#1_-O3=a@z8{ zN#Uu|$-W*vCGfiqyi1DM61tln2JqZ~*Toy@_*BpGM^*V_AGeIPISeivizZ(cD-t|w z87^}L#ScfvXH~x^l$_|^A@WQ-R45K&8vk0P0TCUqCR-8??b45d{H>#XelwWyABvln4eGNKQx;*Ytcl`J$yhwSZr>!!WI{H|q72ZUyA@in(0@%ot2->YOUjxtZ{e*00X5V;5Q+&rl| zoaJWcykL;3mcw{KPdw5bI*ud?ES`dBcl3c3=No=VDuTGnWMIIH`lZ9uZaBA{6-N&n zpNgdW)C67An#S;y>$!d@5&WK(4^BZA{@@-{u9Hu|lkKOVa3$h3;CzD!i`E};ZotvC zd$Z@x26;nMIaTBNNSM^|AJX#<%qnM#tFB#(qn)B8^9+JCHlRZ&BAWpITRq~|S5iu- z#}m}Uuj~s!LAA6!UCs?PblR~tDqYz=eF~2m$xmdy5$-Raf;d9uark7QLuZN)Gc#(8 z+8sM;dCSA{9F6RqoNgDBGFtc8Q{WA~*oJdueV}~D!g2Qyy4xSB?14YYl@^f}_i!`~r*ME$@=` zTK31yxDP#_x?j9rG5YLKg&`vZUau zuut-%y%C3RWuA`ufRk!S3j6x#cWa@65e4QUZ@jHeK{HvbWV7B7qEZBYa#FH#VjB=| zC#5oi+%0Fb~}9jY5CW^xk4U z1yK`*wDp%hs(EU|aRwUN`bd>*j?2sy0PAcyCb-8}yo8ubF+?k}$0-PFFfh4Jp3TCV zD@1`oHB6TSbKUuW*rd0q!kpn#_TI-XXy1{?@%$}M0hi>N&B?79hnZ=IZV&fxjhtIC zaf)1)_dq(JrDFQ`k1fYl6IGzYUe$8$bMmD-_k$$E_4vf&^rzQbuvTx-2*5H3A_)qt zM2>JX!ubiz-V!`gm#;PjLgOLeKfq)(6GQH6a*7XI)su5k3<;$)in(GY2i-zIdkl#} zxD&oAvQF83oT<@#ul#e`CG9FLz3Pd$r74ImC6vy<4_;aaBfmi$W zb&clv`1uURuZHW;f3|kX%2~jgcqb)dRq(CY&V$(;ITgpW6P8m@0^&Te*x;t->VlXZ^k7Q0z6RnB&F% z`NlBcLX$n7)~~Pn>Le>^>2)YyOrwS%Q)?|ATpu40!b|-=anYZG;zDXRxV(+Qfi3Uk z-G|G`KeK{=?VIbv%L_IO<{?;9_$0CmRkwplMte_1x5Av|mhKvhHZ~>*PPyS&FCOol z6TA>U=g=p6@u;6Y>l+l~f^}V_Yu|YeW*}-|%@z$l3cp@NF>YYp(mnI8GI4!tpuT({ z;+(mbP8K}{p?^RooDw}f<>1JAshl|SW!*c#570k4PAC4Q>H|>*aS;I=WU4FLj#I!- z;P4e53Lj}QbNs#|?xlyidA`_B7AO8bd6~W{`zd5fcZ<;(a!ml056=X5D)5*rFT~gn zBubdcZca?t%$SLX6$fU42_$$vyechvbdR}D)dQU%g2McoIRy=~9n*o#zuBj1iKCG9 zXsMhx%pU-E%EoMzb(@vUTt><))iyr4PP8E9`D+C;1wq90C4*gl_X0Lo}Fh{^3`g(p09mKu{O?&MVNaU;WZZE~DP+Qzr0XEOHZH z6Rz^kW&m1~)#A+p8--T!AWlK9X58Js+~(B=750Pmei}|^J6qqm7iBF{PTxw!wJ#@m zGfX;tFeVF)z=7LzMX=yRe+4>1Ic@EjYTx_P9Z}fz*%_n3n+*837t2La4z z^%O*qQSU-gZ{QQ%+@3C7P|I+E__da{bCFjt5vo-_S`pBMgBSI=N&4{nP^`Xp3>2FN z>rPzcqhMY1e6TrY$h%wKHs4)08Ti1eXa@A$Xq{wr@F@*xyOzAvKC;&G9HC?+ME>eB~1dhbS} zIA#i3>TAnqZ4TDq9@+u<$fdUfe?2^PUEEBlUvazcVgNg$o%_3fNY+b0=hQ=Mwqupm zV{!%$>RXReLZ~RjrqJ(w5r=2^(zXtk8E^gi6!Qrp(+~5hTjD_9vA4MinfOlrx{h3H zTtpIi>e|#3Jjrqd#t^+?6l$n^I5caC)IazlrJ3PeIyKC0Iw5V`bm2D<5!QLqG6LM}7t%sF!2km{>SFqMrUf2z=df+LDYM&AH`C1Cp@Ye;u z8;ynAG3x5;(ve{vCyYeiG<+1P93~jb9yf%Hj%zZ_+pxIujb9++dt}!R9`;j0Zc7O| zEjbDPJpgF#>!f$5pv7chA>IP6qwd*x2etCzX-@mD(xfK~)0!3Pby~42OUBm`_q1#_ z^KT9B&*%u4)(xxf?_w}wMi0!17x*L12^2QJA8k3wwV`6X2|9-O(8`HsP^c*Bvn)Ef zd|&6mVY`j8LEa0`A_vlEu!{c`7Y~s}ueot$ZpY7}Z6d#1#=UU**`u1{FAoW<-a09x=@$iRa8}nQ1TabAR z8hG|jiy5CGjtA`>5gNi{>U!-<<0%MLyKeRy`pX6*ut;cvKIvDd=EUmm6H?K}WM<)?lc zYlCEnc=@a!uavf8AQF_QCe+MlOex$+A?|iIU~t=13eU6Vw%tCS!1@*z-o4@nZrg&0 zL4TvRHrfodbr8t0vASMG#1WZpQ=5v(JY$cfZzVMpXH6xM64y#yMSg*AY`(6lP1CJzsZkIjIXoAaN_4QU7Jy1>S4 z)((m6h&B{90*Iuj=u!k3{@A;jg=S@KfqM0KK7P>WxyGlxgwpf)YhT1k6^oyO6d?rd z_(juG&>y+a*HrI#S$C}x7Z{Nm^`pZXjNOaN{S3R38Ln50(XMiIg2{}KFU(yPyk)yMydn)$Q zZ0?<;qwS0Cw+m4oxcR&|>&U~;8V4Z6cN|orJM@B?PEW-p9lIx8)e=n8_+QrFnv!n7 z*lcp86--LN6LpwB*e`{Y)qF;kEJ)Cd=uRJnUr1-rE|VAQc6h}*@cfxx=~rI)8sZ*o z5b%C(Elj83Q}?#C1D7s&?#EU_DywIwY$IK!ExQH0-}s+`?utibhBu2mbiL%1xsZAh zC66sxA8QL0qwk}LzFmr1UBO%+R#(F@qfGW93r4qpY!%#;hUn|`t)-(tbG%1t8lT-tNQ1|yJxbhx`~{U_&id2UR^a7 z9D6>?_&FeEF7B6_Dx`}orQ!_c&Tf!DEwAgQlFq>T7O-|^&%wN*S*)QC6GQ1rn>o!? zGriKzt&ts#tRo7Dbyjyi(5Vq$jwDa9tZ3+HAX`H%kJYeQ+-(-!i=#4-qhKZjxVnc4 zdETtIJMuktn}@4(*>w&)2q*F&J8SK;5}SnxPllb-HB{qgMx|Qc#FxZa-8EXKxi7*t zjmq2{9#so7v$7Q%bxm=pMfAqrjkO&V#OMWC^_-Nvz}VFsW^!Y>ba}rkPMwkduo+i_ z@z|W7Q*#Zld2VaZmi=*yi$n?RK>%qnZj&W}-UBjQz#;TL>1DHWs9e+CA&+^c@vV1$ryvIxY1~HA7+&ZJOuG_cfz_=lxUO6^ zd8f-jS#d~l!#GJR3;n*>U})}4w?uAi4+LXSM)J^XK=4i)=Mlog&O3cAot%E1`1RzH z;u_uO09T;~8wFbdZaKkjf6fSko!N@VNjBh{`ux7_vG8S}U2AGqOFy@))E!~0pL3<7Nkc-f1hVYjJ=~SC0kM@GY^QiBH zOs(+aJZL)c{qb!81`*m|*Z&a=`g09_`mgg=tbpC{h94=T;vjf=$5YTc7g2N*zRO;J z3Mx+o{L==~w^PtcFInmoH2F0IfWkJ|_@YzL_v_2#2K7B8o(dmu3hGfwI0YdATV(X& zI1O|PqJ*Jxq{cH}pMt=Es<;D$$cIerQsJg>`9%at`3=nX3vyrNWSKM!d9Z3pdZo(^ zWQVbD6Q4tV|CBy{*la+0ey~6=M%^EXAd5@_q523vUR2F9>3G)&nwRYs@XZK zV}~eQm6LZ0s^V$A8z{}JD?V0+OM(Y~);ic1h61ozo&OYMf*|PVjs$K&vC+2%j!}Gb z?TF*wxpPkmkCA(ZrF??`pF|ihd`F1IEYrMC0tp%Ka~%U{gL(y6HFelb7WTFRXQvyM zuAN2ulHd!4P?N&#+MzPKOa0>`Yv1dCG2ItSLaZKSv-XyRc*K9z&aj;}*f)ROJ>2|> z^a1rCYdRiZg=2>Ckv?jlDI@$`&EIu6;qNsm%<;^?$+f-kWCdJB9haNAqc+Eurr3c}y3sKTjZE+*o#I+ZYi2n)p4F{eT}J;Kyl^q#uUgxQ5-oBcI3l7b+%h>FG# zC9#Kwm4nrd*K8N7N6<;r^kW7f+a;@8Abhd8ko!~+icJX(9DJNK`(3u0>Famh zxDjY^@=g^Nxi8hFX)*SM<0m|`8DJN!Vd$+|W5}W)Vds;h?+L2*5s#1HF?STPP;i@leb>7+kV)ZH*33l<`>QfrdrD_|Xs4lR)wk8Ju6wNZ z#e2jXYiGQhzPNusNz3MBfiTe0%tVOKHd}* zqZASff*w^MNG@QmIt4C4r;5)L6qepoX`WBz$@VQt;tABh9nUhSwfjaN^2Jrd_{bkM%7uxKd^_;R6+|?x` zFsl>TcIZ40kx$6&SExM!6ZRokSa?vh8~Hw@@FM(7H3d0x)Lh?BaM5o1%g@v&kd1gi zh|gDh2z1;grRg<)?FwxSb^u>H|9Y~}3;uEeBVC*&M7&cBqH-A103V!!d>#253vkFg zfJskVDu_|TghOiG14l4)BEfY}byYBpT&t-szS!V_a42=`Dd;s1_K@`Q06~&VLB$=D zMB?&$|Q4F~O5PAyYLVOSZZ)yox zPycmpn>Fhc$bB1J z0D>nbRHAsDqkN^gvc67cQzG^?xD5UgmM?JC@4mm(cP>6NYGqIuO+~jJ8Z%|ptX`)X^Y=3?|+0Z1x7yJcIsNsAKM!0dgjb0L%c#3BM(9O$qKS= zxT_teA2EZoAoNh`VyFU`pncettI`rbiLd?<{^t{9Yil03K9$ zPS8_)At}$#dx`^{S?5t2B(oS7mb1CtbuDv#?+z;ZFd?P*RiCSSn}~UDTDl(W(Qm?j zkwogRupLA;h+>}#1mhAizI=OTrsv6t6I!Z|W61DE*6J~f&xJ2-d*9E+Jb^ujiDN;; zNcbmpq5!bvXiq_p8g!Gh;jPA~$7N~?^5s{cK^*OA=HyKYF{R%&74=8?UbTu}D8)&8 ztZJ{WiPJ^GTLC?Y9_t}XJeme$Yyb~Yw7O~7PwQ1(Iy9VDz@u;d9c-g5Gz zMi*bir8gWvP(Tkw5kv(57^YC6f>3ROXP(_UKT9&DgYCv~=ml?2Z)PWVadQL8;^&GW zu8AQBsmWdoAOl?Z{6FRAsNUdEFPivp3T^h$&tc~_tkdUXOZ4y)wLF7)_`PDHx)SE#y04 zJFgGkWB^@(4>qUdchvWG6VA*}&bl4aPOk=h!FS)(TCQ&uy38xW7FPsaPXs)2bzo?U zYF18y10eR{3FNK@WqbE=i5;SEw*C3huMvD{wpFoo9Nq1AJ90S;-|Ow&W+exXv`SQe z<}=_6Q#3>yQa@ws(zL#)CW>5dC!fg&MtMC2Yk^{K3CS1`qKi5Uf~c144HwH`CQ+7A zlT|7k6F*lO%)Os2}gZ6exha2npT+2dT3Qis)jqCF*s6fWQ}uVPhT>a ztoU5<(6%m{(*Ceapwp2TC-}gdW%FX)di%Mu&q=ooYuh}CXAR2ySOS3HFboKME_n=+ z!9-6&KDL;A_x57#SNP)58l!la^!BouLe=*6iTJBEzGWThuT$DFr=Z}h;id?DIPQin zJ%M!@%J;+a{OjyZb=N?u!;3#>lLvjF%emNGG82G|Xl@ad^3TVjy^~-{QRA{(acj5u z!wV%fetzQWd!-4oMf+$VhcgrinpI>*s-=Y~!|tp~AYD!&j97NT!J~HedDS*VGy}>W z9S$~uADtgFt?4r;dzETy65l}iPE^Yb~gsTHG)v#&*^px ziwW$;__;)5p(_MaJCB-4u9n6xs^mSA4#Z9vD?h@2c`Mh5iGWM6B$!BB^09YXC9(?)~G zhi-4aBmGtM9j-{T*~?MyqsH2zT*zuL3F38JUFVK~JD5#Zbn~|R^v@#6jHiLR>fa|p zKH1X6&$-z2EN^k?QKH5MrVbYI!7uXT29$2Cv`r*fD&UMeQNao;RY38TDO#eWf5kyXeqh|&P;-L_%1!Q`L%zg@r=gxF(TZncv$X}vgNvL#J{%$t8 z|78lqFvXmv4c_->NH9w#S6f?Kr~7}f4|{1$eO9zv(6`X?nt7y^c?(ciC`1D@0;H7% zb#O5nkxO_dY6LL0s znOoI{eZ;gG$JJRe(kgfkg1ON9WveAAm+LKO9ixg}I)lFL#k9+T?=rm0N8+A`Yp8Q^7o_rT~%f%vWM$P{cP1Cm#O8C6W!p_Q#U<^ZCe2ciqG+9tVw8F^E!u&1e#VKKn~P`~ zdX*5l432{-jcNxk&lz~ySdU4D#Ag(JUl2!(qVHRRD2odj5T{CbZZyNPq!HN^NbXX-19=f;dV zbxkUZi6LG5s|8U+H4iz=0TE|E(@O0rTREUY9VfM%pwc5&M<0{_4x2r3co*2>fU_K7 zsK&~>j)w{We!=IRz)zF2u-%DP`%tneaYz~KuT|gdaqB4%xy1hz2Y0KVS1KG>PQ%|J zMMK7sn4+6})U!^JbpX0A|b zY;(pUm}O&~{S3sU&Lqf^Wkp2b-QmL?o&INY_Agk%5UX0~Ln7ZPfV`<&uxBdaZJlFH zPRk|<+sOr^X*Xk0Q?}Iv^fU@9donT34TQQL(-GP1&j{^5#b(+CuBo$oJS&+^IOGs0 zLnlpY2O!sJE{^oc;I)fYm4-uf{zNv&VlxnTspDBa-j+ri{r%%g3w8r$WU{Q@ATKx?VsJN)FA zg}KSB9{@~HrTCv5r2ksXM0K=B0&FRIYJqTG67wEsc8kzox;~8z_n&*{+Ax~YHsRsq z8TeF;J7vklI&qQXdbhGsO#Xn}>;9m?_5p$_oXntrUIt)?s;~l1qesizzo%?MIBWgN zEDkz?;S!7)xI=qPcRfOp$D!DVJQxW2 zd%*<6ISc$KQ@hS4;4Z{Eao^z-BqeVtTZE6dg9h?WQ7)s9yQwD@vlhW`JC@vdFdw|F=W=jxi)KqxisuK@=y&aNf^UQq9-r{Sn}bbO*ewstyvEH zDKZ_IDag0H>B$ zt3J-dK7Hr1wm0XO0jkGuFNnR8=@x%{u|c!s0{X=*yBGEi@^!_8K+C%EYLi$`d5nZH zI-O3bkF(-qkGNO8)VhIHw8*#>mvWr@4_UY)7;9=qxKRG_j0w(tVQykCw&#Ldfnh6EXv_sB>@)Q&GaH-#`hW#AuyybsE+Bs#uR%`~f zC9P35G?4v(jb9J1ajFt(S?W#xsT~e zyZ6jDDSku~@?@WRQmsCdLLPJXREA!JzASjr+Ir=qYA$E3@uTFEZ~RIHH1sm!T$A0kEFA(gtL@@p)!L$H253hE7wScW`a(Yl11Z%^~AwRj7c2WO^W+NQ);*0ZZ!}bo)Bt6m)Xg){X$U+COw3+-NcL zTwGN4d?ahk>+vzKbi$T7*a+XfJF!2f&sCY2;P3~Kz4|Bm=D+HnzyFT>l}2U)qMo#* zPzm7GDM4bl33FJno0ZtLt{J0_l7MW7ncscvXa{I2FNY`SvVV2uS*}Ba>l6Dm`X;f) zlK_f<$3q!lBB3mV$dXVw!l(Q@>kYr6{pC_IsVgwcK{JN-ZqcVvj+*TB=iXE*SL{7I z1>J%ZE{%}sUl+h8Q49(YFNLWY6R{=N@KW*D4qqyx{nE*)UX7J(25Zfgx9kO<%DOCS zzw3pkkvbcvd+)yw(nbwpL|2?^O7=Q z8bP=5NrX$Eh)!7F8IMvuej^4NOgYDD<{XY_t|7DEy6!P8b7TT=N{T!N!Is11XUPM) zQdtj^mkrLi)IYCqfAyIIe1Ky=awQcm3)!PefM9LbP9EYVJNl<&N!kdsJ_}_Ggr)#n zSO;y~H7g=G!c)V{&Tf=7JcG9Y%ZQ@X{+oyXAJwl^|D+y`C9rc|X0VB2(bS}CUh=(X z^_=jy$4t?k=S9r)cYAc|xrmgZFhU(N)Q`}*#2QByf9UZo0PoOceQ9_6>PcY(i)f7a z)hU@{6hP8<;=R|4$gMEnMFBeJMqK{BrsJ(h(Qy$kFF0B@nf@moZUWc*R{^Z}%Ea-} ziEgM)5{GDqFPH7f!D=5+(Nb56gky6Lbm};?ZUXZ*ixVch@%i^+ciXaOsk@u#m#D*AdsG|a)L1^d zWp$1M;-1lHV#+J{*s;d2I9nHGaRLbVN-dje&;~Gr#IqWtB?CgFb0qdzW1a`o+JL?ad?r2%Z1cHx>Wv?`K??8*QD1 z$H?Y@>+y7g$X?DmsgCc4C%_q1@ezvyoi+_)`v-}4b1Fvbj?z=3mQ(fTB&R(`Ainul z6ruot>qUt|(DkS7cIY zq+XpmKW(l@(N&HQvIsZnAB8@w3sZFke8_!nEHptC6644^+!VYRYaOO#UmbNkt$*nZ z=em#&ESih#x85&6caw1!!bt8!p%WH(!Ap>>2%hkrJcU4X}zj4^-W^q2d0=GQfS- zIPGRB(pO@z${p1nm*6umuiw1p=HbEUDg5pU@!7hx>7cujb~l&3G`HTfb(34Bj$GN3fUp)9@^3(`>zK$`rZMcZcmDK=^iV_$NwA< zC18eoRhu8=pw={qXa6gs{=1rnycgO%DUcmS@JB;yImq(1!r{bG+;GC}^cy$Gl&Hrt zQwNagw59U}Po7K&ON`B|bK`AWh$+pFk)Kc=;G;_rAs|KASqk6iT51kP9(#Y^D7?3E zMN2CGQ0!Pa{P3*Ju?xI4&5_}*3Z9RUyL@QHS{gJYJHa=QRd&3Td-&S^@Eqj3gDA6zOAi0R-IHb?@_2-`qCs+KE0vjQujbCUW zw#g>U`?K4)`Fk(<@;syaacY|bVy}vGN7IKJ8fq(QQ+9FVQui&kw|t6=m5p_tQ=)qM z$Sicg-bMda;2j_8HwI$~l^)HnBq%M$Psvqh(B}!?EFB;AB#$=GU;lC5W$sbpn4A%?w_g)Mlu4uAt1r`2MT{S$}o^rHzznBc2y#BgX znJ&p_Qdv{6xAF@*T$8QS9=Uf5uprKGbOTJAz=MluM}1Mp$dvRHhF-#%c07Cd;%VUd zoh_j&(6`eXQ$MY{ewltbf(G!}Lu9ER6p>R8e3Reg-ph%T?qQVKT_7`F1w`WoDGr5B zBeMfYW||Iq0*x(SQus`OUT5+xxw~l0{NTGuP*7{;Vs4D!nW+}!UMIjG1iW4mr3|_}1gBO<&I&7_$PzE} z&Eg9DcisedwiBuM$OA~BM^r)3$c9ESdqTT@B_k{MF->K}!Gg>_@|Qu}Rmf*gRx%5K zy~11EY;^qx5>?|{s}oD=b^X7MX2TbdSmesZKWaHIoS_FQ-|h za1BvZX9}{l$k8D?(!tN;yCKCO_|TT^__oD^O2|T(-QBB_A_)n8-8Gu1??7a73SbaF zy!9&TUYJ2&J1!{QOqd|eULqMCY9?FvN;a5}yYA(;xe_Ohb`xH7u&p5cQ#X-)jm$K5 z!UnL_tV{$8f9cPG9*9{wCqBopt(gZK>==G)p&TjMLnn zFY??u15-ITJrwJQBJxOf14(AHV1TS;(wmz1ei`pPb9Gh6WnFf+)o0J|58r#MEG&D? z+N9P3S!=Xxp{`{2y23n`#6g|_W1(<@M8THpQVB8|#ojD_wUqF-qjGjbSD-G<=4+il z-_)fV>m=@tj->i!wcWKgC_xiJW?;o>b(jYQ+T(8408zk89d3c;>xYVV;Rf(vU;gjO zEJ|t9D$iwzsa`bzl93(QWo?L~%vn1rt~VzzBANFbj3nxw3a~`pq$if>KJ@U4J{cn_ z5X!K9%dRiBbkB!^CjifvgAihw_^@iUx-n+E?4bbwJ38#lxYoJIYGAA(k|3+z4a_{N zyTqF-$o*DC_hv9oKFhmkqwbYr&{|DHqDz#%%lC81FP6%cRo*-fR5jPPqtNHPMTZ*! zRyUIXSV%ikgf4&3ueOPwcR9M|uk8YnMCAVOLPN*kv_4)gvU3f&2#O8F^jAZ$CTBGH z@+{r7y>nk$=*hjfpdsA8kKC;RYA(3;6}B?8>|i5MR^(WCSXM`a*0v7l#82#aV!&z} zRVDqFKthk1za};2gXl=`nTgbomrdxb6^@`QE_Xu`!Ruft8JP=PMunRpNWxJX2~YN? zf&YknB-PXD2l+4v_^Yql{u3%^{qM?PvIKZnY`|@oiA8U2-)w*ZxRtknmm`xQ;H)+eP~R_;8v{BI5_prEtP zo!E#xzKvbhOmb=`$c92zSEWpL;#~KI@7h_mw|NvpU)dZR0^9w~DTvKe4LlXNEZO$S zr|kUuC66;!_vd=c@Ev0NO2tYClaJBhp zlV2lhz~?0Wo{Iung?**3&VTOo%8$);aY>f5ws^@F)r#DuY^+xgl)EHwc|A9$5G{qL zdI8;h4J?0X5L1V+EWiOvdqTXCz6X>gXvCoL+XLT9K4PD$cR_}>6ArmsE)o$j{pH~X zgFdGP-xxu`c1#^RgJ{vrwnLL;mQ>xPmZ{lgwaX;w*995+y zxf|PGQNxeRU38Ih4O+0zs178VVeaHY5CT6*s%WA(Q4VtB%frDcyzgtBn|7)k$bifH zwj>QnT-us3u7r@8W&k=w39fkV zcnjd8Vkf2&Iq#(|?Zn$Q$@=|>=t>Hu(tDBhqZeOYb3XEMR{g5=0Ma53cU7T9* z!Q7L;`mbLDQjEnP20RRq?Wkh^@uQ{AvBs>lT^XjUEnhsobMI^#Dk5qsH@*~%>-Hfy2NLBwK*?$PkMfQX(MjtlV`4^5J;$J zoep*Vq#ggq#y)_}!D}A_6&}n}*mhv0>wJuws%v&jVYlnZkn(h&hp%%t zG-)%q6F=FvySREaiiXc|OC=lX6+V{|Zn2W$_<`8tBmfhpeFASa(takVK$dl%XUED_ z57DJ)m24cy6aq06s;h3C=HYaCTQWOH00p)tYo1)$4MG7b|H;`#u`k%=H;#>!BlA`2 zk9}lFp!H(B^IlfV%|>9B3tLAWkw2 zHOOhEMP1aVjey0e175TPNyl0#rE9yjTuguFr^{}OkWUb@-yuVwq6P=xTEJ`-M9NqUR(!qgkbk|K!#9fgS70badc7Tt5r=E znKC88p912H3L+!)WxXODFR?{gT$A2}ZE&3cRILn zI)xmrlU_m4xee89n@_8)VPIVKWc8qw-;O#_L5qX$j5iq4&ruzXS`d1xq*7bC39 zn0Z-935r(p@Ynh9+t(|g@`RFJjQVVlND{p^TPHkcfyloHOmc1vrqo>ktoJ39$HzOf zziS6&9qA|JSLWnqePy_Z<@4b0f5oZIxrwn4cko}7SeiZHvrXeTNziTnK(-1>YP42?bI`&xpuuvVrF%(@)BKjX zxJ3_jysD(fIU1uaLm;MQ4g}k&@C`Ugz~7r>?EqJy;ef%R(gRUIR|lZ$K%|M*G)SO>8$tuqAYRKt{)7h8DLm9vAYLPAbzBOe@vbESk zCdr=2zLW_`NJy5VnNap66^fWdmMoKfH+I>wXJ-(yOlHU!X6EU9{myyc&wGCFd4K1; z=i~F3@rRk``7ZZz-Pe76Eu;vT_XU48K~RL7!tz1WNX`t&ULpA8jzRpzmz5QXbfli% zB;xF;m2*9%A`jJq%s*d3;m&*gQQa2$lFrokM-O0$^7=bDL(ISorH1Wo{HJ{Nzh;K9 zFKJ(lDP- zKRtbGZPLQ6aJ8!}NRcGfdw;;Mx5O&}bkP!~G@JylJ136+`L=;N3n0kG7aG1IQz5I4 z5;W??$8$Nvy+@6f5I0Hlc*ogyN^B*=)X0L31Rw;E^8>Ih`X{%WVCBDGB*->0|M09Z z5Q~)G^K?F~{>|F=WN+o`>oLhkd~OjD!XrPndpy)`HTl=yy@0-|W=-PU$)(H(ig#$9 zAV=WvGM$Z_)kY06c4eXa-vhtNNbqw;iMxo$@;VOHMnhNNxS<5HbVnlP8nWjivIWMm zql%qBN4953%WRj8K3zvxY~&Cl*i$sEDC&M<;w-QR#2C$k&qWcW%(e_s5C9A4G=-p1 z*kKK8idyiUGD<*ry-SYC=ed^btS9C2MU@89gcpby`4TK2F$6?WKp4kk`R7sL}cTl)`D%?TA_ zA&}&+O3jmlm=u@x_$)8czWQk0bA#UmO_pw+NfCSuZ?XDZXm4bsm^jyf%{OTY+>O?P-}h!S()_a;&ogSyFFz5pAYTdRM)vTg zmpk{?)+K2P#?SJ)HlMt>5lbW5roz6=5wyTKpcCLY;QDxSiP-oYG3UDsJ}$QlcIH9(B-Fnrih@eKkCcw#tv9rT(q~1TyC(#SXVUbIN7|VRs?xF2kpq! zDIgo5kr013SywVUu`9sIHtKZE=7a*tjtr;pLH!N_v{X%cxBQ$yua+M%o`>@e8)U;3 z$1Z-QZ1`j$>N&R!bKJw-DcMD(yz zd0Zj3N?Ih!8O@EL%F@t}_cSjA78obufBzi*{ks2JMaG59Po7%I+Ul|MjXgZw*&J;r zWWvC#+y(w^98orh#}LbI(9qcX3iPm-Px~Vu4)y4ch>wh!4dqm)I5m4|U|0)(Z1tVm zT0G6o=~+;J@yp=%m)}tK76&_9n8+}{5~3*^C~ir1BdY6_jZrTb+Z(v#xs4G%w-@!* z7gQ`HOVQif_=L((JK(qlcCtz@_+m{3VZhr=zEfRC*2=#ntD;=WmyBS)Wq7sy_)w+M zM0cA6_oW$OCn-t83xDbI`g~wqjlyL9MfO&_$GmkL{_LDRVKcHYXLv`LrTT}yyj(Fy zc4F(=iNj6!=mpK zcQR&mk_EHG1p>2m9`6El)fA2cS)_447pnOJ%5#&8%KWy=Z@wTL8X=5s=O0_qtG!22 zy(jTIbv(>VJ>ae_imB#Z!og{@AxsQ8R zm+eORdy}|*dBRtjr(2l%Q%;H&fUSh9MG$l`OsHmCtn0g?dO07@OsWOpg|E?ky4jM+ zL@s-HigCkPl^BoEf+!xo&?}{1Du?2zpg_}{IakH@nV>+TrH~Lr-c=J;>h0m#=2Lf; ztZj#riXYrPDjIpWigI1naH+DbX737ojn_`k(n&HC;)Iv;Z}byeNe<-CUqJDDbv|wL zcwn0Dqm-vETZc4kRHv1fTq42BB=SXTbyt~cs0pjrMIE&wUM%^=YXEIpyW4eH>Oc(^(ma#j(k3Yd0NmKfI`%=q5-!tSxLl zc)!Pf#j~=ca4moo0iO*G3Xdz963b0Y06hZ~$|3M%YJk?9Kt7YuDPt0fE^B=x< zs6a?_5M!?OFIY7wmExR8o49l(zM{h{@;8npORhBW6c{ z;y`%rq9cHB4j`O=yBPijd-G_M#<`1B*=do!<1+8^#8AIhgLb~#oE%{jaW^l$3^4}NP7ugynKu18-eu1kRW3Psfx@+?yg-pgWd5N_r#-Xg z?okN0LnTrz2F?2T-<-N0%5YUZev}tg%Yc{qfi8jJBZvVc9$Ge42DG*Fj|g?z5Zc#n zz5Gj;ta1*Pyf8HH9biA*{_Zo~-NT~D$Jc=kpmM_@<}8XVs`)0wQPrmKTqrNWZYZk? znj_#RnDSQ5Z@j-Lapx7`k`>3aUahopdhW>(NXl{_bax!RNvmo+iEM=tOc4=S9u4WI zgKjCc6&W$b_7A5-eh$#GjunaQjq%P%;ApxxPdJPg#MsKL`-{I*_0b3Sv^qnA|etucvJS8yPBtM z*1Lq=I8+(qnhaI>ATNxyC(V${`?@rhiRUFifN^iD^nIbS<^{~3!@zUN!JTQ!dgLt1 zLyxaaQl%V$+Is%FC+rQQg7Rw5s~dR!7!+aCD82ZdVGmG{x(;K1_(H6j1Sl~J)qJx2 zvbHhHiaS!8$g`{dbT8`Zz!^>GmK)hAlMiM1_#gcxHnU=7BTB4?_gf88zSU;T+RVS9 zyuQGzOJ$R}7p;AxlWYWyqL`7gR30*IVJ;jdyjX3*^UJQC7M};&6lQo3tx$;eKNaY9THTI*N)11wsGBgw%_Z307f|>yGPWid$NRIx$bc_n^ zMmEW3G;}-|lZD3@%}S=$lIIlALasj(1*H-`X%1O{zLZ_O5k-yMPr5<-7>uB(QMF!A zdOA1PR(wwkkjzR6S*pCl($;qPW(fVGLxRn#HWkiy`;TTUc)Zt`nDS{lGS2oK{4{yX z%%JX>yhQLoO4LULYzx>0119jOof)f+*6Vz0w(ZlyAETNOdq4G3XOhJ4sai_hqIgJnvwn{x6kKmYY5f5#aFfG;kJSDQnIKH>!|Kz90Mf{oh z`HU*o^ft6jCg5$9QKM}$M1*pE$dliD&>*zRDVWKF%lW-=`jsdNkZ zeXau4+8*Wk)4HKo9Zk!WW=@~z}rJ%|^%z7x1EwB}U$i8X9-~3oqF(9)T{T?Gm z6FCOU#1JkH{H0r5M(ppRK~bXuRlnJ?Wj~)A@xDgtI`HO$OqPdTOJ)GJoBs;zBf6V9 zQbQrx!79MdgNF_cf%;KET4kclik1bMLX7pbJRh(&Cgoh!Y8c(&GXwo}G31}G65i3i z4JgK2@+1O=dzA^W?5-ptEvMd+VifFLucB5Jr67cowm&!7l;zU!xw@&1Z!kn8*mqn1 zimN*<28`_|)PqeCk2zR6Ejt;1dnM9klvBgEbJ|AN$K3}x~Yywb_;Bg1@r zQ4E`A*j#qEkmsgZD`)bR=ZhmGIy1ptYbrN}bT^HZNy||*VMH`9-?s~jGqQ22x#{wt z+wS7j?q(&2dV#Vg9_6$4C7SCT@0BJ%1%G^GoS6!uwNN|g+Xc|^OJ{CN^ur`BZ1O(| zNDZx$^L+S`mOS>cS;tu-40>9}_S|~42o;XFjuCKf7cnKgyM$nWSugJSp>aB;?@V!W z+>ez7s&$&|4XI?<@yCcfFtF6f;OhT5vb=B+Fr+Wh4>T z^6BJsugRT{_X@3l?o#=G7LF&oPj{mpkB_?w%M}%K{r+tZ z^;!++cg`J&9cwwKE!o!P#n^L+nV|;r2Q1YvBRDQ;(shGIQC9)Y3kz}a!S+P4sV>6g z_n0)%BmQ8O^i*qRH{X?luW|7J94B8|(1ao&z4*oa11) zpIVcXP|fy8{`I*75HK4i9L%)9NUf2j`V@Bw{H4oLN%4Bd_KaHa7DE~#VYV5;Jv0M4 zG$kPnT{W9VG5FJ5`3lWQd=_ZP|me}%f{h$ix(aMK(b}noys#e&wT9$qz9;$M+5j)Bf? zpu~iZco1wqul~(XRKdI|er;%NCahhND=+Y8TuNwRHiw@3Owsoski=a-j<+{87QbFS zDtWuhle_!M+BJ83*k{yBcDxA@X_7EkE)@$Y8%i>?*DmK4E;zrZ!`7!hX6;&Xehd~J z8y#l%esxvoZ-$DRE5vV~1x>DI-$`h*-m3vnEfzP3nOrocW$vK4p_b%*y(lEiL*>!! zRgy2_bb8R|qBhK_ve(jL=M9bvSGLMNV1LVNd!a5(I?D$34ZAT+bYH~5J5fx*u4P>B zgQW^rC%YNhCNAdAw0mC_2}!=@A`i%ME8@HRj(WF5N5%|V>hiGPId&$LX~PEagUnBUioW|=LjUfomzIK{ zI}SGVyo3rSws{0q&X-QGhnV;m`srgTDn}skHM@XtJkQVMs2qOl>@yu#C$;2**cxQ0 zZy&mP6ug&56vo;>QcASTsOA9}!D2=V7{}7i7KImTDN~v!g3nTP6CGuBUZ_mI(VWrU zc``{1*Qu=X)?72xnmUPD+W-1sMtnr`IGM$koJCa7A^Xg4lBq=co#G^R%I?}h|EvQq6KgP4?ju$zGjnORJ(L>m8br5SI?Ug*%LxFrYqV?BiVen7#&mV)Y*)#fG{Dhc7uo#8B%T?Zz&9DzH+O5Qic#mH$ z=)DhkndepSTjid$yjs{;UarGD7H`XB11hYyN~ z|ANVUWEIf?%)Ibo0o9gPTw%hzx*et1f9zVS>>-%U%4x~E2hMcw-|0U6OZSDB7C_Y@ zR;Cb!=b;)RzrBxWMwp{do?+)lqrhG;|NXw5C(eupdo1*6x2LXqHH;KX)>WT$-W_8b zHtMAO_Ml17(x+L3CgN2h-8&6^EEd=0T)Y%tJG|Bea!p^|Ev0V%85H@4Rl)&0kulT%s(lZo2QFXDLonLpCWkUxO6aslo%h{J}WIZ>Wio(aW( z#?uWZEcY>Dxzs0a*!qU#3pI|*4*E_H7NN@>$3XJz<(JLLeb9zgbUgImh8D|@!qtOl z<$wf|f^4eYY=tv6Nf75=-Xce|WWUzvS-(HwFc>Mb<#46{P(NL16(O4T>C+qSm=cIS zLy|zspTGTZMe9dVPFYPw;-}Zbk-cUezuE;Qber{b=|xS>HeuY`qYX|a-g_CX#$gf9 zD4q#3gvfB*ssj0x(P}{LCY7g^WIBjlu=lp3bkL{i~CFGsosS_@|NKT zD`Ev7YN+-;8Z13tUh4r%bB`nCs%u3=qK2I3H{0NcsJ4U~DMYFH@G_SL82h>vac10I z?eVIwhwsrZK=RP0OV>)2Q3+y<+~kfDleE2|CBmV1-FjVx%AEkQXj1@;-+W;wK?cVj zeLO?xed|o1tA%+$)(tI*ua(m|v%39#a&@|$1qG>j-EGxqJi87G6uC-J)D!#^F6!+e z+z`rRj?EpxvV*RZT#9b2$U=X}^CXDPv?$}M(jM~qKJPu`4n;Q7qnZs-cN8Wa#_;gN zpuTC+cI|ALw$~T?LgMdVC-_|wg=xvA?t6o53{xZTc++y%)pU!Pr`@bgr#lwU4(i8e z2l1*FARd%&YoL`>{!G>Q?pfYuNlHG)U}#sko1ECSq>)$j%jU?QxqJl+i$HHxSts+E zX`|Xax`3bY^!!@gJ#VeM<^-`1L4sFB3K)v7BDOAIUTP>j5Wcrgv-%-kN68HMEj4f` zm3oNw71*xdaI%y_Q_%@hE9p_ysHVKfpllSwgqY_=gYBEh+q+}#pNIVqDHE^z42YOL z(l&*EVKuQBRy0<7hOn)U9vb?gob0yj7q7agmF()@^5yvj0~|9%kHz6I`{z9b@WrWkRd#GldOb=m=g1ltzgw?Qv=9ZxeW;knhHggS&|JcioWB& zN~G2N3bG!()|Uu+pK`>btDH6oq0g#*ie~&FU?Fzqkfko&k>_+9bgO1ogI2m1Kxk*l zb&&8MT&DyDFk9!r(7eUs(&H!~dTZ9+p=r19p* zjrTda_{Ww9Qk1v$q1$lW24=itj1&v3hKCVxPN#Hx2YlM(i>KcL2aiV>)V3FAzo^vI zU-YYPy3{LvBH~h(zGlRp@lEsTsV+BfQrU5h>y{CjA{M;wGf7w~_sU{9wrmA&JFg(z zuaJ^!5ST0!(N|%dPUJAkP&;)u1)3P!HScsz1lYrZ?6hRdZ*|K?Gd&l_uzl;@5(*#H z9uy8i;>q!WR*Cu zi?=*z9s8`_DYoQ{1&%N~ z)YkwiR~hMk!~sec8W4PvmeG4t@5x89dk^JGTgZ{Q=?;1M>5!S6#D?`h%$ZeH;XimP zDoqnR4xfz=v3|}lU@=dg#S9=Z+}frE*K@huG-`rCT?7C$bGqxSbvhaMIxJDshS#Y59f%5zy>Q zUU^AfD|pj(2l6N}pmmPJA<()b)$e;s-s(_VP=S5*-Kq>G>oAdl?tFz%MB<^Ys7f*-A|LO-Dii!t{5Kj#tJS@Yl zW0m#!E-?XG#VQ=gATdQVGg?9>9U6KPXTyG!Wl{$^7j4RNCrOTBkb`JaITf(B6 zFxSbB1pWokww&%sRU#y`rlO<$1P0XYekEHAeP|L{JU^j#Ua(WJo$d*}yPKMFZqZDq z^XHaf1DV46JX}Uq%wHHJ(>~?Vzat#du-*}-@Pg^ifq}~Uq~>o?=S9EIDIgzZKfkIk$L4bEGKdKFWpK-+ilHFcL)c3RoWcE3s76uA*N0r*Tn?3`>vfxc==uy5gxf1 z{RE$O96lhIq|=bny%caQRM$atGWF`i&Mh#lNA-ZQvqg$iT}R7NlR*0GRF2U+=Fmp` z@6MLt%`mIc*5i5g3Cur~UpSxX#B(JiCG$=fK`{_3!Sw|sN;bbikb3@S$`htDB)3>z zQc@P>SXC7&$(-0OME4~coH%q_i8tHX`I0^egG&zr-+#aAvlg)}D7N4Lvh>1SXof;% z{H77{UP4gzZS4yYaSQb!nWvJf#g~71jIOHrt{N0E@HV#*m!Un`20Uz;sJL z7~9;8n~LMpC;P#hZqif-F_h5O8f^qTQhX!5Jr(Sm(7Is9fyYy4HVP}^%-A{X8LN+7 zwi^=skQfsBkk82{1Di5``_4mNng^) zzjRynXqEQzO9bw%G71(48(spTH10k5-G73E{%he|_GN2`WwoFj&4Gm7hqroWBd)7% zD)pX4=|9J;dMg^Hcv953c;*5B^O2(0C@1 z4iujH`%so>!hNZTrBN)d(9Zu;+SS!YZX)aOU0=|*hC~E+!;g<`GSs5J2&@|Es|tKB z4m;@Z`v>^)PY=o}vKyr#K93M|>(3%%ua}Q{N(kInI29lG?T?Ju*LI{|FfdM`7f{V- z8_%tkuFt~BOt`6nRpRn3?VNTGapxSnX}wgM@~7M+_V?(J+FYtIXpT5)HR^Y1#{kKm zE$6+|>+PNzds9A0!o!=_df-qrKrK0%P|Z9*C@2w46<$M86A=USJdZMOK`1~%5@08b zp=n$f!HRhXSX-~9%^}tha0}AeF(=8_kY;RbnEb_fZ@o#iAnQ#U&!dwyd)7e1_Y~;* z;xd}g$?_@;w8k-nwa*kVM0*s_*SRwx##%m3r~06-9AnH|uHlE{23THuCK$f%B+9WkB@utTfy zHn8`(CH3_$qXbr$dIW&C)moK=OUi#TwIkJ3g&a_-gbFM*v z>OsD9&?!UWh8UADtTLqURl}FSkpsyw`BQ|;M=v5_YX!vLSTkTv;;rL6C;@>El5|mc zKh^%P%JC?Y9krlS_H0q}`y%+h51<4Xf7>eS4jxyFpI>h1T+ApW2(5)Nsvjx1smV|Hbjp06{bODLH=#=9aBt(8L-PfL+?{4BXW8^6Y z#e3}aWA>T$WfvN%A|`Ha{-u)#koWVhPC`W@C4r@z%(H6U}4uL2Q*pF=<^A1PAe zW(UW!vysE6?*IBrS5ukdMxxCkKU#0CA}ZkoFZQ+=)JrVE1{TsNS@)s&ICS!v{0(nG zC3WEfQ}(KNgXlb7%HAe=BUsIB=<(uEa+NNt4X|lW{~Trg_x{day#iYS=ANNAFzO-7 zz5m6m5LbyZlC3Vqm4HF#wSU{yw1#UT+T>7{SVF*Nn~{kis@djYy}Aedord(hD2w44 z;j5*T63lS&J^mo?Psm%hZA`lM^M;5%l*eU{vy#MzZ3QOMmvf{b0L@ zpZ{P(puQ)P&-~M_KJ;G^!4GD+-HR;m8v5I>eb|^z#k_{!%sWso zVeaqv=YjlJ(s#!+O#6hjyfYWQE#Lk*tIJ5$0Yybz&2KhU#^eP+0Pd(pe$lmTp^av6qUYbF7um{UabTCTcN*FE1PZ{v)%Z7()*a5 zzQNAjKfJWjKg>k2OV&IVT|R6B?Yccw@4AH9nv|l1Qe0u{gwwM(lZZ^}&>+x->W5)q zBM7Pxi1X-AlpcuJJtQMpsn;4QQlXH%gb?f0C2%*XHBe8@gI7F)qWIe-{b?M(Dxks& z=*Xl)md|H|4(fqn`2)sD|BTCwKRHJ@zo`QG2%0M#H;pFC-T*axdQsXtPlz?xVpO9) z7S8s-6TjoA%DCU~oHp8+&v&k{(<|k10aWbx;Xz-LW^$eKoZ;zOutz@hV;7d?&pxmIr@i?)J(o6n72> zEqE;I{oyAVejp`-wFc`C&9~2>iX60@9{}HI?<>|85#Md^Lpp{Xux~oSJctwyJ6RD46A%^@ zA!MkVnmoYO{BIq%|AKCExPEMrzXiig^AQzeMy$b0WGlb5rrk34pX=sN3~)iHnD z#EJf?CGT9)JwJj?YGAKyjjM6KPH~)j>L2-ZJtk>A-GuE~@-_k0jyTjP=YeIacRSIi zcda()i8r0~k>z;HBcF@~ZMkX5NAi?@^3nh|DX_Sa1sfAA?s>N`_=#v4ttOLcDNb=^ zqrhjbZ#zK1X9#{#gBP=c#QwrG7poPt)n5$zUNH1{$xOv<*X}mTZ;}YD>uuU9wwZR4w&)a6De&9@otI2cl&dp3wDzupwwp7?}Q8q+zsK}F5uJz5;j)(|=) z@u}ZIAP0A<2`PEEQVxn{@7ad*dSoA{sxDM_H;v2W5WHUO^ox))T3a*)D}rXUZ)T`_ zcmzV!GQ(!^xMvfQC&Kb^))x__Xo3z)LKp`$O0R(|0tf%GjO#awxE+4>!NGUMZ|}wO zoEY2qww_r95h?C-t5i0IH*Gk3P3_#Ho3|feik5+V$SILNwv~?d7dwqoKigh1 z*uxH&{wjwb#yD7>UNbp3$0qRJssBLJIt1P`{Hxk~^;~3zI$^VA^N;^Q9{<$LZAG#L}rJ-cCX)088cxsTzPnBgt!6lWWy{FCgP$BW*wS=eUiNEyGdo zZ2{AjP$u5}fUsNi@~0PqPZ*Hg4Semh`AR`Yxp~Pi7aN5_r&D^^rGuXGb8r~)965J! ztbHbEVJtRHExg8m_kzOxkd{tHT=3V9d@kbP#gSCvq?y4bMUYnN3W)H^Dlt0#($VEK zkf=0}k*I$?P9vo&G3IsN<)whK=ur-^I^5lXV4l}hPwN~zRm)jomYy(g9MJCT>BvuV zDSu~wna{JuIWF%U`#Z#h61UzpeYo=r{IguQq-@9Cf+DfB5=yh9qwDAK z)|}NrSw0f6@TP7UbL8{0c}G6d(Vbo5v06Tui~p}nZz%fA5o#fD4r|~v6&33FTs&|V zA^^YC zPdWpNnsXREFSfcWib<m}U3ZSIC zWY^n zu(!em%a?4>Hs!~D(_h+B5TniX-e#CivSDKoSZE+&(@n@HS2|XUJvE#uaQ7-^tMhy{ zxormDR=ooGr34ljnnZ0fc4)j~)IZO}f>m$HwUg_MUsnLWDwS(gff6teRA5Y+x2G9K zOU$w>S66BG!G1xCJ^ANJVfYud%EQ=Kb7Z-cc4a`we+)5HCiPXlDDSanmwnD*qN?JX zxSsTyvpfF_r z3Bh>rNaFkKF@jqjMoI-T^;mw^dD!u7$%VXqg?>n2?-4j$0yu>`G*F@qdkm-=LGURR zh&c)D+Y=|Fqz390)X7!WaUY7;Z*yk7mY6&=EzuBkN2?|2_@!0E#swL&9QZ$}Mmk1C zR2-tbood*YF4OYEq};_n%bouU%zUMV{o_rhK8)#4HW#M6qg%2U7C-RDOOWv*Jxy55ELkF3r$m4*(2d zfI96uOoTy9qw}b^r@@8~>klpTxFlbFp6F7jOJb|}HmR}uJnY*y5i4KaSFU^hgNC|n z?CyrW1GFPx^E(Dxz?tEm@FQ#Hy+k|rfVm0&Lq6dNH?`?lGg_QkP)#UiXimSm8IM>o z$DujbkQ_wgglNTkEPgrtygzkny(<0QKXtBU{!4dFj@>fGVemo4)T848KZv*F)toHY z&hL%w8Buftoz8VE)wEfa#^z%we)#}QG)(!E(5p&eOEUDcw)CnVIS60|;hO*KBjNu- zR_Hj2(_LGKK*}t9Q*Jxir}<2ydIFr_l>V^liC><(86ZXp-mBJp9RD;WWyN`~0`*Y^ z&;2ZK6-^iHmFLDF9-?RB0_m)c}d`a+B} z&>55(mpdiY*|ICtULQDpZQoq(=XE+!%TGsxLJ%0g?Ff9-{5Qbkl%(DuR5Y2TKs-NA zp6ak(DSP|q@>!P>(`mpMV|8>iw!+!_^1o|mgjV4StF{&S1s~&Afo00zfPI%NtZf^w zaw?GgdGmaeKQl7opmK$!2#`VkhAvfTg>yOFke8|@{6Me3eZ{VdKOh`?lwLpL(6 zSkIw@@dlkeJRW>4xdg-0 j=$#MgwfQXZ5E9XD3SH<=7Jz{rr}wk@pWFw----VL{kx)% literal 0 HcmV?d00001 From f073e25626426f1a2d5741d5ec3a06c2ebc2aef1 Mon Sep 17 00:00:00 2001 From: nrvo <151435968+nrvo@users.noreply.github.com> Date: Sat, 4 May 2024 16:38:10 +0200 Subject: [PATCH 2/6] Update description.md --- apps/ollama-nvidia/metadata/description.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/ollama-nvidia/metadata/description.md b/apps/ollama-nvidia/metadata/description.md index 369a19cf..bf4f2f27 100755 --- a/apps/ollama-nvidia/metadata/description.md +++ b/apps/ollama-nvidia/metadata/description.md @@ -1,5 +1,5 @@ # Ollama - Nvidia -[Ollama](https://github.com/ollama/ollama) allows you to run open-source large language models, such as Llama 3 & , locally. Ollama bundles model weights, configuration, and data into a single package, defined by a Modelfile. +[Ollama](https://github.com/ollama/ollama) allows you to run open-source large language models, such as Llama 3 & Mistral, locally. Ollama bundles model weights, configuration, and data into a single package, defined by a Modelfile. --- @@ -105,4 +105,4 @@ Here are some example models that can be downloaded: | Gemma | 7B | 4.8GB | `ollama run gemma:7b` | | Solar | 10.7B | 6.1GB | `ollama run solar` | -> Note: You should have at least 8 GB of RAM available to run the 7B models, 16 GB to run the 13B models, and 32 GB to run the 33B models. \ No newline at end of file +> Note: You should have at least 8 GB of RAM available to run the 7B models, 16 GB to run the 13B models, and 32 GB to run the 33B models. From fbd4c9540112425efee7c610789edba46ac51c04 Mon Sep 17 00:00:00 2001 From: nrvo <151435968+nrvo@users.noreply.github.com> Date: Sat, 4 May 2024 16:38:32 +0200 Subject: [PATCH 3/6] Update apps/ollama-nvidia/metadata/description.md Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- apps/ollama-nvidia/metadata/description.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/ollama-nvidia/metadata/description.md b/apps/ollama-nvidia/metadata/description.md index bf4f2f27..fe6e4744 100755 --- a/apps/ollama-nvidia/metadata/description.md +++ b/apps/ollama-nvidia/metadata/description.md @@ -4,7 +4,7 @@ --- ## Nvidia Instructions -To enable your Nvidia GPU in Docker : +To enable your Nvidia GPU in Docker: - You need to install the [NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#installation) - And configure Docker to use Nvidia driver From df76c7de0b75e384f1524657ba87db761281846d Mon Sep 17 00:00:00 2001 From: nrvo <151435968+nrvo@users.noreply.github.com> Date: Sat, 4 May 2024 17:05:01 +0200 Subject: [PATCH 4/6] Update config.json --- apps/ollama-nvidia/config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/ollama-nvidia/config.json b/apps/ollama-nvidia/config.json index baf4214b..e6474a5e 100755 --- a/apps/ollama-nvidia/config.json +++ b/apps/ollama-nvidia/config.json @@ -6,7 +6,7 @@ "port": 11435, "id": "ollama-nvidia", "tipi_version": 1, - "version": "0.1.32", + "version": "0.1.33", "categories": ["ai"], "description": "Get up and running with Llama 3, Mistral, Gemma, and other large language models.", "short_desc": "LLMs inference server with OpenAI compatible API", From c063892680742f1215b35bfb8dc1daa5ede28fdc Mon Sep 17 00:00:00 2001 From: nrvo <151435968+nrvo@users.noreply.github.com> Date: Sat, 4 May 2024 17:05:31 +0200 Subject: [PATCH 5/6] Update docker-compose.yml --- apps/ollama-nvidia/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/ollama-nvidia/docker-compose.yml b/apps/ollama-nvidia/docker-compose.yml index 153fdcbf..fc4de92b 100755 --- a/apps/ollama-nvidia/docker-compose.yml +++ b/apps/ollama-nvidia/docker-compose.yml @@ -2,7 +2,7 @@ version: '3.7' services: ollama-nvidia: - image: ollama/ollama + image: ollama/ollama:0.1.33 restart: unless-stopped container_name: ollama-nvidia environment: From 4b09d44d56d857d87d421095aa437d5219e68fd5 Mon Sep 17 00:00:00 2001 From: Nicolas Meienberger Date: Sat, 11 May 2024 11:47:20 +0200 Subject: [PATCH 6/6] chore(ollama-nvidia): small config adjustments --- apps/ollama-nvidia/docker-compose.yml | 10 ++++----- apps/ollama-nvidia/metadata/description.md | 24 +++++++++++----------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/apps/ollama-nvidia/docker-compose.yml b/apps/ollama-nvidia/docker-compose.yml index fc4de92b..842c11d1 100755 --- a/apps/ollama-nvidia/docker-compose.yml +++ b/apps/ollama-nvidia/docker-compose.yml @@ -5,10 +5,8 @@ services: image: ollama/ollama:0.1.33 restart: unless-stopped container_name: ollama-nvidia - environment: - - PORT=11435 ports: - - '${APP_PORT}:11435' + - '${APP_PORT}:11434' networks: - tipi_main_network deploy: @@ -18,14 +16,14 @@ services: - driver: nvidia count: all capabilities: - - gpu + - gpu volumes: - - ${APP_DATA_DIR}/.ollama:/root/.ollama + - ${APP_DATA_DIR}/data/.ollama:/root/.ollama labels: # Main traefik.enable: true traefik.http.middlewares.ollama-nvidia-web-redirect.redirectscheme.scheme: https - traefik.http.services.ollama-nvidia.loadbalancer.server.port: 11435 + traefik.http.services.ollama-nvidia.loadbalancer.server.port: 11434 # Web traefik.http.routers.ollama-nvidia-insecure.rule: Host(`${APP_DOMAIN}`) traefik.http.routers.ollama-nvidia-insecure.entrypoints: web diff --git a/apps/ollama-nvidia/metadata/description.md b/apps/ollama-nvidia/metadata/description.md index fe6e4744..dc2a4c21 100755 --- a/apps/ollama-nvidia/metadata/description.md +++ b/apps/ollama-nvidia/metadata/description.md @@ -1,22 +1,24 @@ -# Ollama - Nvidia -[Ollama](https://github.com/ollama/ollama) allows you to run open-source large language models, such as Llama 3 & Mistral, locally. Ollama bundles model weights, configuration, and data into a single package, defined by a Modelfile. - ---- - ## Nvidia Instructions + To enable your Nvidia GPU in Docker: + - You need to install the [NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#installation) - And configure Docker to use Nvidia driver + ```sh sudo nvidia-ctk runtime configure --runtime=docker sudo systemctl restart docker ``` + --- ## Usage +⚠️ This app runs on port **11435**. Take this into account when configuring tools connecting to the app. + ### Use with a frontend + - [LobeChat](https://github.com/lobehub/lobe-chat) - [LibreChat](https://github.com/danny-avila/LibreChat) - [OpenWebUI](https://github.com/open-webui/open-webui) @@ -25,9 +27,11 @@ sudo systemctl restart docker --- ### Try the REST API + Ollama has a REST API for running and managing models. **Generate a response** + ```sh curl http://localhost:11434/api/generate -d '{ "model": "llama3", @@ -36,6 +40,7 @@ curl http://localhost:11434/api/generate -d '{ ``` **Chat with a model** + ```sh curl http://localhost:11434/api/chat -d '{ "model": "llama3", @@ -44,16 +49,11 @@ curl http://localhost:11434/api/chat -d '{ ] }' ``` ---- - -### Try in terminal -```sh -docker exec -it ollama-nvidia ollama run llama3 --verbose -``` --- ## Compatible GPUs + Ollama supports Nvidia GPUs with compute capability 5.0+. Check your compute compatibility to see if your card is supported: @@ -82,10 +82,10 @@ Check your compute compatibility to see if your card is supported: | 5.0 | GeForce GTX | `GTX 750 Ti` `GTX 750` `NVS 810` | | | Quadro | `K2200` `K1200` `K620` `M1200` `M520` `M5000M` `M4000M` `M3000M` `M2000M` `M1000M` `K620M` `M600M` `M500M` | - --- ## Model library + Ollama supports a list of models available on [ollama.com/library](https://ollama.com/library 'ollama model library') Here are some example models that can be downloaded: