From 40b74cc60b23b2d203ceafee0459600c100ed3c6 Mon Sep 17 00:00:00 2001 From: Etienne Perot Date: Sun, 3 Mar 2024 14:27:50 -0800 Subject: [PATCH] `ollama` test: Add image processing capability test. This asks the LLM to OCR the gVisor logo. Response: `The image you've provided appears to be a logo or branding for a company named "gVisor." The logo features a stylized astronaut with a space theme, suggesting that the company may be related to space exploration, satellite technology, or similar fields.` PiperOrigin-RevId: 612241427 --- images/gpu/ollama/Dockerfile | 3 ++- images/gpu/ollama/bench/Dockerfile | 3 ++- test/gpu/BUILD | 1 + test/gpu/gvisor.png | Bin 0 -> 21859 bytes test/gpu/ollama/ollama.go | 17 +++++++++++++++++ test/gpu/textgen_test.go | 26 ++++++++++++++++++++++++++ 6 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 test/gpu/gvisor.png diff --git a/images/gpu/ollama/Dockerfile b/images/gpu/ollama/Dockerfile index ff7d72db3..a859f3f46 100644 --- a/images/gpu/ollama/Dockerfile +++ b/images/gpu/ollama/Dockerfile @@ -12,8 +12,9 @@ ENV OLLAMA_HOST=0.0.0.0:11434 RUN bash -c ' \ ( ollama serve ) & serverpid="$!"; \ sleep 5; \ - ollama pull codellama:7b-instruct && \ + ollama pull codellama:7b-instruct && \ ollama pull llama2-chinese:7b-chat && \ + ollama pull llava:7b-v1.6 && \ kill "$serverpid" && \ wait "$serverpid" \ ' diff --git a/images/gpu/ollama/bench/Dockerfile b/images/gpu/ollama/bench/Dockerfile index 8a97fa832..fffa251eb 100644 --- a/images/gpu/ollama/bench/Dockerfile +++ b/images/gpu/ollama/bench/Dockerfile @@ -6,7 +6,7 @@ ENV OLLAMA_ORIGINS=* ENV OLLAMA_HOST=0.0.0.0:11434 # Pre-install models useful for benchmarking. -# These are huge (total ~115 GiB), but necessary to benchmark +# These are huge (total ~120 GiB), but necessary to benchmark # models of various sizes. They are in their own image file to # keep the test-only image lighter by comparison. RUN bash -c ' \ @@ -22,6 +22,7 @@ RUN bash -c ' \ ollama pull gemma:2b-instruct && \ ollama pull gemma:7b-instruct && \ ollama pull llava:7b-v1.6 && \ + ollama pull llava:34b-v1.6 && \ kill "$serverpid" && \ wait "$serverpid" \ ' diff --git a/test/gpu/BUILD b/test/gpu/BUILD index 9caaa2845..4b302ca3e 100644 --- a/test/gpu/BUILD +++ b/test/gpu/BUILD @@ -32,6 +32,7 @@ go_test( go_test( name = "textgen_test", srcs = ["textgen_test.go"], + embedsrcs = ["gvisor.png"], tags = [ "local", "noguitar", diff --git a/test/gpu/gvisor.png b/test/gpu/gvisor.png new file mode 100644 index 0000000000000000000000000000000000000000..5919dba68770170eb5e2fa5de319f5c0a3dd5f46 GIT binary patch literal 21859 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�@x#mTds9@~cdTJxa9Ek7{Wx7k$mCV*{mT<;ADidj(p+hMM&B?%^;-Z&w;qZ}JE=}!ggkQOA z{AIa0e1=xty>$g0Kfc|5yX1t*^SgYt-*l73*R&j3?*G?OujL^Z69a?i$j1cZPZS)VGYD*G`%U_nmqw*46k|J^fDEyq90@KAU@tX|qa}_dEXITTbsRVqkFa zs@d06uX0ORtNCHe$KqUmulMJp@>qO~*ROQjT75)1SbS5IU0-Ifn3~-aIqe)do>fuy?6$V$=k0E1d?`@-wCmP3Nu98oU3RaVm*4Su za8fI-Gsnsjhc1~D!=xFX_t}r8w(>o`8GJJAvavW&kw_(x^p2ZLWuk_XC({`0EpIKJ9)bG*5d-~n} z)7NkRy7gA%>ELNcUX@%g?!5k4XWxN8w-N$Y9$CrHz;H?HQE-0ukE_lnS!P+!`X>7N zTJFZud5?wreMNRU>OTDt`uEdr*X`_aLhsMTJbN{3k&%Xe{J*U)KA)&~Y`R>=>im|= ziSw;u{PsTpoh7nP;G4Vt|C+?x zW=rj(Pdq>O?!6(eTXl5C;hS%^sk^+L^*z#fx^Z2#woKUHITsli6p~$-qGD~2kLR8dtaGI)1sGzg=4Uxc0NH zXQy4L)Oiyg*UvH~+rl4oJkOJ7F2!FC7@zKXpd$YJgwn_3{qr}dcKrKr*e<#Bcj@(# z&siU0lwWV()T+k7aDpxM5aZSWeuv*{ID*3CF1qr(vA;RvbY}bI<^Ix7XUpw*?;5x< zX7?Gsxs0XWN0#&PJ$2E4Xu`t45P5ut^sC_Z<(q>3O<((u*S1&m*{1K8)?IQh`Vqfw z-uj}Gu``8i`d=LUymf*9ZqG3F2WOZW7+3=LN2yNTweaZHJst})Zl`Ui$bDq9vG%sy z?N^=W{(mq|?)KB}z8!sIn%keK=XdUe{XZSa#=!7F`_t-MadpXsZ_O$FS!sL z+9;Z&~Wbp2@cI7xH&FE7lZO!9tgSW&R?ul8%_x~-h)LJSNJLXIJP z@~<0TRqtk=eJAk6G`D^UYu=M`XL_Z#-@fLpbyAb@^t5%xVIM#ns14_DDeeBZDDm&T zV`fX9p1wEp((i@eg&7zWSSu^v{ukiX_GZO>D0mX+KUh%VTnODUTJ$o)=$jf7q3=9kt)DA8v%T!rlC-Pd-_T|S9 zl{SyUZ+%?J%)qdtP%WUGA)Zm8)$3O2Rfvsd7o z_Wa15{Ck~!_uaEp+<(bopS)cV149Fka(FL$?W?a<5^sh0G@QQ_m^)v)RC1B)_gy0m z_dln!75CpVD{8Egn=i${(4a0lSDHgZ{0SR(Ry%Xl>ka;Ir9Q6of7Mtp<=#E6pHuk1 z*iV18@Pqc>^JmkW9^EW^qt5v0#LfNRSH4cY{D1b)s|N zKVRN(DdhkEtP^*8&e_}l|6aq#Fbali2sHe^FDEkr