paint-brush
Chơi Simon Says với Gemma-2b và MediaPipeby@darrylbayliss
665
665

Chơi Simon Says với Gemma-2b và MediaPipe

Darryl Bayliss11m2024/03/29
Read on Terminal Reader

Gemma là một LLM mới của Google đủ nhỏ để chạy trên các máy cục bộ và thiết bị di động. Bạn có thể sử dụng MediaPipe để giao tiếp với LLM trên thiết bị và yêu cầu nó yêu cầu. Mô hình 2b dường như hoạt động không tốt và mô hình 7b là một sự cải tiến. Đối với các phiên bản v1, điều này thật ấn tượng khi chạy trên thiết bị di động.
featured image - Chơi Simon Says với Gemma-2b và MediaPipe
Darryl Bayliss HackerNoon profile picture
0-item
1-item


Một vài tuần trước tôi đã tham dự Ngày hội nhà phát triển Gemma của Google. Một ngày dành riêng cho Google để giới thiệu các khả năng, tính di động và tính mở của mô hình LLM mới nhất của họ có tên là Gemma.


Những mô hình này thể hiện một giai đoạn mới thú vị cho Generative AI. Các mô hình đủ nhỏ để triển khai trên các thiết bị cục bộ và vẫn có thể mang lại trải nghiệm hấp dẫn và hữu ích.


Đã lâu rồi tôi mới nhìn vào Mobile AI và cảm thấy một ngày tràn đầy cảm hứng. Tôi quyết định xem điều gì sẽ xảy ra khi tôi thử những mô hình này trong Ứng dụng Android.

Ứng dụng

Tôi muốn đưa ra cho Gemma một thử thách dễ dàng nhưng mới lạ. Chơi trò chơi Simon Says.


Các quy tắc rất đơn giản. Một người chơi sẽ trở thành Simon. Vai trò của họ là giao nhiệm vụ cho những người chơi khác thực hiện. Người chơi đóng vai Simon phải nói “Simon nói” trước khi giao nhiệm vụ.


Tôi đã tạo một ứng dụng có ba màn hình. Màn hình nhập cảnh, màn hình hướng dẫn và màn hình trò chuyện nơi Gemma có thể giao tiếp và giao nhiệm vụ.


Simon Says Màn hình ứng dụng


Để tăng tốc độ xây dựng màn hình trò chuyện, tôi thấy bài đăng trên blog này của Meyta Taliti cực kỳ hữu ích.

Với các màn hình đã được tạo, nhiệm vụ tiếp theo của tôi là tích hợp Gemma. Để làm được điều này, tôi đã dựa vào một bộ công cụ mà tôi đã tìm hiểu có tên là MediaPipe.

MediaPipe

MediaPipe là tập hợp các công cụ với mục tiêu đơn giản hóa việc tích hợp các mô hình AI vào các ứng dụng trên Android, iOS và web. Với MediaPipe bạn có rất nhiều sự lựa chọn tùy theo nhu cầu của mình.


Logo MediaPipe


Nếu bạn muốn bắt đầu nhanh chóng, MediaPipe cung cấp một API có tên là Nhiệm vụ để bạn gọi ra các mô hình AI. Các API này được chia thành các khu vực khác nhau như Tầm nhìn, Văn bản & Âm thanh.


MediaPipe cũng cung cấp một bộ sưu tập các mô hình được đào tạo trước để nhúng vào ứng dụng của bạn. Một lần nữa, hữu ích để bắt đầu nhanh chóng.


Nếu bạn cần thứ gì đó tùy chỉnh hơn và không muốn tạo mô hình từ đầu thì MediaPipe cung cấp một công cụ có tên Model Maker . Model Maker sử dụng quy trình có tên Transfer Learning để đào tạo lại mô hình học máy hiện có và cung cấp cho mô hình đó dữ liệu mới. Lợi ích của phương pháp này là tiết kiệm thời gian và cần ít dữ liệu đào tạo hơn để tạo mô hình mới.


Model Maker cũng có thể giảm kích thước của mô hình đã tạo thông qua quá trình này. Xin lưu ý rằng quá trình này khiến mô hình “quên” một số kiến thức hiện có của nó.


Công cụ cuối cùng của MediaPipe là MediaPipe Studio , một ứng dụng web để đánh giá và điều chỉnh các mô hình tùy chỉnh của bạn. Hữu ích nếu bạn muốn đánh giá các mô hình của mình và hiểu mức độ hoạt động của chúng trước khi triển khai.


Đối với nhu cầu của mình, chúng tôi sẽ tận dụng API can thiệp LLM, một API mới cho MediaPipe. Điều này cho phép chúng tôi liên lạc với Gemma và nhận được phản hồi.

Đưa MediaPipe vào hoạt động

Để sử dụng MediaPipe, trước tiên bạn cần thêm nó dưới dạng phần phụ thuộc cấp độ cho ứng dụng:

 implementation ("com.google.mediapipe:tasks-genai:0.10.11")


Tiếp theo, bạn tạo một phiên bản của LlmInference . Đây là đối tượng bạn sử dụng để liên lạc với Gemma:


 val llmInference = LlmInference.createFromOptions( context, LlmInference.LlmInferenceOptions.builder() .setModelPath("/data/local/tmp/llm/gemma-2b-it-cpu-int8.bin") .build() )


Điều quan trọng cần lưu ý là đường dẫn được đặt bằng .setModelPath . Đây là nơi mô hình Gemma cư trú trên thiết bị. Điều quan trọng nữa là mô hình Gemma được sử dụng là phiên bản gemma-2b . Các phiên bản 7b chưa được MediaPipe hỗ trợ, sau này sẽ nói thêm về ý nghĩa của điều này. Bây giờ hãy tải xuống mô hình.


Bạn có thể tải xuống Gemma từ Kaggle . Một trang web dành riêng cho các nhà khoa học dữ liệu và học máy. Bạn cần tạo một tài khoản và chấp nhận Điều khoản & Điều kiện sử dụng trước khi có thể tải xuống các mô hình. Bạn có thể tìm thấy trang Gemma ở đây .


Nếu bạn đang theo dõi bài đăng này, hãy nhớ chỉ tải xuống các phiên bản gemma-2b-it-cpu của mô hình, trong tab TensorFlow Lite . Bạn sẽ tự mình làm điều đó nếu bạn thử phiên bản gemma-2b-it-gpu .


Sau khi mô hình được tải xuống. Sử dụng Device Explorer trong Android Studio để nhập mô hình vào đường dẫn được đặt trong .setModelPath . Nếu bạn đã thay đổi đường dẫn hoặc tên model thì hãy đảm bảo cập nhật tên đường dẫn.


Sau khi mô hình được nhập, bạn có thể bắt đầu chuyển lời nhắc vào Gemma bằng phương thức .generateResponse . Đây là ví dụ về lời nhắc tôi chuyển cho Gemma để chơi Simon Says:


 private const val SimonSaysPrompt = """ You are a Simon in a game of Simon Says. Your objective is to ask the player to perform tasks. For every task you give, you must prefix it with the words "Simon says". You must not ask the player to do anything that is dangerous, unethical or unlawful. Do not try to communicate with the player. Only ask the player to perform tasks. """ val gemmaResponse = llmInference.generateResponse(SimonSaysPrompt)


Nếu bạn đã sử dụng LLM trước đây và có hiểu biết cơ bản về Kỹ thuật nhắc nhở thì điều này sẽ có vẻ quen thuộc. Để thận trọng hơn, tôi đã bao gồm các hướng dẫn phòng ngừa trong lời nhắc. Chúng tôi không muốn Simon yêu cầu người dùng làm bất cứ điều gì đáng ngờ!


Nếu bạn cố chạy ứng dụng này trên thiết bị, một số điều có thể xảy ra:


  1. Ứng dụng có thể mất một lúc để phản hồi và cuối cùng đưa ra phản hồi.

  2. Ứng dụng có thể gặp sự cố. Nhìn vào Logcat, bạn sẽ thấy thông báo về việc MediaPipe không thể tìm thấy mô hình. Bạn đã đặt đúng đường dẫn mô hình chưa?

  3. Ứng dụng có thể gặp sự cố. Nếu bạn nhìn vào Logcat, bạn có thể thấy rất nhiều thông tin và ghi nhật ký mã gốc về bộ nhớ đang được tái chế.


Kinh nghiệm của tôi rơi vào loại thứ hai và thứ ba. Trải nghiệm của riêng bạn có thể khác nếu bạn thiết lập mọi thứ chính xác và sử dụng thiết bị vật lý có thông số kỹ thuật cao.


Nếu bạn không có ether của những thứ này. Có một tùy chọn khác, tăng dung lượng RAM có sẵn thông qua Trình mô phỏng.

Tạo Trình giả lập Android với RAM tăng

Việc tăng dung lượng RAM khả dụng thường giúp ích trong môi trường sử dụng nhiều bộ nhớ, vậy tại sao LLM đói bộ nhớ lại khác? Để làm điều này, tôi đã tùy chỉnh dung lượng RAM mà trình giả lập Android của tôi sử dụng.


Nếu hiện có trình mô phỏng, bạn có thể nhận thấy trường RAM bị tắt. Bạn vẫn có thể cập nhật dung lượng RAM có sẵn bằng cách nhấp vào ba dấu chấm ở bên phải của RAM trong Trình quản lý thiết bị.


Nhấp vào Hiển thị trên Đĩa rồi mở tệp config.inihardware-qemu.ini trong trình soạn thảo văn bản. Thay đổi giá trị của hw.ramSize trong mỗi file. Cảm ơn câu hỏi về Stack Overflow này vì đã cho tôi câu trả lời về cách thực hiện.


Trình giả lập Android hiển thị trên đĩa


Ngoài ra, bạn có thể tạo trình mô phỏng tùy chỉnh bằng cách đi tới Trình quản lý thiết bị trong Android Studio, nhấp vào Tạo thiết bị ảo rồi nhấp vào Cấu hình phần cứng mới . Là một phần của các tùy chọn tùy chỉnh, bạn có thể chọn dung lượng RAM.


Trình mô phỏng Android Studio Định cấu hình cấu hình phần cứng


Tôi thấy RAM 8GB hoạt động tương đối tốt. Tôi cũng đã thử vận may với 22GB RAM. Nó hoạt động tốt hơn một chút về tốc độ, mặc dù không nhiều như tôi mong đợi.


Tôi nghi ngờ có tắc nghẽn ở đâu đó khi Gemma được tải vào bộ nhớ, vì phần còn lại của trình mô phỏng chạy rất trôi chảy. Có lẽ một sự cải tiến ở đâu đó có thể được thực hiện.

Gemma 2b & Gemma 7b

Các mẫu Gemma tương thích với MediaPipe là phiên bản gemma-2b . 2b là viết tắt của 2 tỷ tham số. Số lượng các tham số phối hợp với nhau để làm cho mô hình hoạt động.


Đây là các giá trị được đặt trong mô hình trong quá trình đào tạo để cung cấp các kết nối và suy luận lẫn nhau khi bạn hỏi Gemma một câu hỏi.


Ngoài ra còn có bộ sưu tập gemma-7b , sử dụng 7 tỷ tham số. Tuy nhiên, những thứ này không được MediaPipe hỗ trợ. Có lẽ một ngày nào đó!


Nếu bạn muốn hiểu thêm về các tham số khi nói đến LLM, tôi khuyên bạn nên sử dụng trang này.


Việc có được một mô hình 2 tỷ tham số được tải và chạy trên thiết bị di động quả là một thành tích ấn tượng. Mặc dù vậy nó hoạt động tốt như thế nào? Hãy cùng tìm hiểu.

gemma-2b-it-cpu-int4

gemma-2b-it-cpu-int4 là LLM 4 bit. Điều này có nghĩa là mỗi tham số được mô hình sử dụng có kích thước bộ nhớ là 4 bit. Lợi ích ở đây là kích thước tổng của mô hình nhỏ hơn, tuy nhiên kích thước bộ nhớ giảm cho từng tham số đồng nghĩa với việc độ chính xác và chất lượng của mô hình cũng bị ảnh hưởng.


Vậy gemma-2b-it-cpu-int4 hoạt động như thế nào? Thành thật mà nói thì không quá tuyệt vời. Dưới đây là một số ảnh chụp màn hình về nỗ lực chơi Simon Says của tôi bằng cách sử dụng lời nhắc ở trên và đặt những câu hỏi chung.


cuộc hội thoại gemma-2b-it-cpu-int4

Các phản hồi thật bất ngờ và thật khó chịu khi bắt người mẫu làm bất cứ điều gì giống với trò chơi của Simon Says. Nó sẽ chuyển sang một chủ đề khác và tạo ra những thông tin không chính xác gây ảo giác.


Ảo giác là một hiện tượng trong đó LLM nói những điều sai trái và không trung thực như thể chúng là sự thật. Lấy ví dụ trên, không đúng nếu bạn có thể lái xe tới Sao Hỏa trong 60 phút với tốc độ 60 dặm/giờ. Dù sao thì cũng chưa. 😃


Ngoài ra còn có sự thiếu nhận thức về bối cảnh. Có nghĩa là nó không thể nhớ điều gì đó mà tôi đã đề cập trước đó trong cuộc trò chuyện. Điều này có thể là do kích thước hạn chế của mô hình.


Sau một thời gian, tôi đã từ bỏ mô hình này và quyết định thử mô hình có kích thước 8 bit lớn hơn.

gemma-2b-it-cpu-int8

gemma-2b-it-cpu-int8 là LLM 8 bit. Kích thước của nó lớn hơn so với người anh em 4 bit của nó. Có nghĩa là nó có thể chính xác hơn và cung cấp câu trả lời chất lượng tốt hơn. Vậy kết quả ở đây là gì?


cuộc hội thoại gemma-2b-it-cpu-int8


Người mẫu này đã nắm bắt được ý tưởng của Simon Says, ngay lập tức đảm nhận vai Simon. Thật không may, nó cũng bị thiếu nhận thức về bối cảnh.


Để giải quyết vấn đề này, tôi cần phải nhắc lại mô hình mọi lúc bằng các quy tắc của Simon Says và kết hợp nó với một lời nhắc khác để yêu cầu nó thực hiện một nhiệm vụ.


Các lời nhắc nhiệm vụ được chọn ngẫu nhiên từ danh sách để chuyển cho Gemma, mang lại sự đa dạng cho các nhiệm vụ được yêu cầu.


Đây là một ví dụ về những gì đang xảy ra dưới đây:


 private const val SimonSaysPrompt = """ You are a Simon in a game of Simon Says. Your objective is to ask the player to perform tasks. For every task you give, you must prefix it with the words "Simon says". You must not ask the player to do anything that is dangerous, unethical or unlawful. Do not try to communicate with the player. Only ask the player to perform tasks. """ private const val MovePrompt = SimonSaysPrompt + """ Give the player a task related to moving to a different position. """ private const val SingASongPrompt = SimonSaysPrompt + """ Ask the player to sing a song of their choice. """ private const val TakePhotoPrompt = SimonSaysPrompt + """ Give the player a task to take a photo of an object. """ private val prompts = listOf( MovePrompt, SingASongPrompt, TakePhotoPrompt ) val prompt = prompts.random() val response = llmInference.generateResponse(prompt)


Đôi khi, nó thực hiện một phản ứng bóng cong có vẻ khác thường. Tôi đang đặt cái này xuống kích thước của mô hình. Cũng đáng xem xét đây chỉ là v1.


Sau khi các lời nhắc đã được thiết lập sẵn, tôi thấy sẽ hữu ích nếu chỉ dựa vào các lời nhắc và không cân nhắc ý kiến đóng góp của người dùng. Do mô hình thiếu nhận thức về ngữ cảnh nên đầu vào của người dùng khiến mô hình ngừng phát Simon Says và thay vào đó phản hồi với đầu vào.


Thêm một chút mánh khóe này không phải là một kết quả thỏa đáng, nhưng người ta cần phải giữ Gemma đóng vai Simon Says.

Ấn tượng và suy nghĩ

Vậy Gemma có thể chơi Simon Says trên thiết bị Android không? Tôi sẽ nói “đại loại là với sự giúp đỡ”.


Tôi muốn thấy phiên bản 4 bit của Gemma 2b phản hồi trực quan hơn. Nhận biết ngữ cảnh của Gemma 2b để tránh phải nhắc lại nó cho mọi yêu cầu và cẩn thận với thông tin đầu vào của người dùng cũng sẽ hữu ích.


Đối với các yêu cầu đơn giản chỉ cần một lời nhắc duy nhất. Mình có thể thấy Gemma 2b có thể thoải mái xử lý các tác vụ này.


Cũng đáng ghi nhớ đây là phiên bản 1 của các mô hình. Việc họ chạy và làm việc trên hệ điều hành di động quả là một thành tích ấn tượng!

Tương lai của LLM trên thiết bị

Tương lai của LLM trên thiết bị di động thì sao? Có hai rào cản tôi thấy. Hạn chế về phần cứng và trường hợp sử dụng thực tế.


Tôi nghĩ chúng ta đang ở thời điểm mà chỉ những thiết bị cao cấp mới có thể chạy những mẫu máy này một cách hiệu quả. Các thiết bị mà tôi nghĩ đến là dòng điện thoại Pixel 7 hoặc Pixel 8 với chip Tensor G và iPhone của Apple với chip Neural Engine.


Chúng ta cần thấy những loại thông số kỹ thuật này được áp dụng cho các điện thoại tầm trung.


Những ý tưởng thú vị có thể đến từ các LLM trên thiết bị khai thác Thế hệ tăng cường truy xuất . Một kỹ thuật để LLM giao tiếp với các nguồn dữ liệu bên ngoài để truy xuất ngữ cảnh bổ sung khi cung cấp câu trả lời. Đây có thể là một cách hiệu quả để tăng hiệu suất.


Rào cản thứ hai là tìm kiếm các trường hợp sử dụng thực tế. Tôi nghĩ những điều này bị hạn chế trong khi các thiết bị có thể giao tiếp với LLM mạnh hơn qua internet. Ví dụ: GPT-4 từ OpenAI được đồn đại là hỗ trợ hơn một nghìn tỷ tham số!


Tuy nhiên, có thể sẽ đến lúc chi phí triển khai các mô hình này trên thiết bị di động trở nên rẻ hơn so với việc lưu trữ chúng trên đám mây. Vì việc cắt giảm chi phí đang là xu hướng thịnh hành ngày nay nên tôi có thể thấy đây là một trường hợp sử dụng khả thi.


Ngoài ra còn có các lợi ích về quyền riêng tư khi có LLM cá nhân của riêng bạn mà không có thông tin nào thoát khỏi giới hạn thiết bị của bạn. Một lợi ích hữu ích sẽ thu hút những người dùng ứng dụng quan tâm đến quyền riêng tư.


Tôi cá là chúng ta vẫn còn vài năm nữa mới có thể triển khai LLM thường xuyên trên thiết bị.

Tài nguyên hữu ích

Nếu bạn muốn dùng thử Gemma trên thiết bị di động thì đây là một số tài nguyên có thể trợ giúp:


Gemma : Trang web chính thức của Gemma chứa rất nhiều thông tin bao gồm điểm chuẩn, hướng dẫn bắt đầu nhanh và thông tin về cách tiếp cận của Google đối với việc phát triển Generative AI có trách nhiệm.


MediaPipe : MediaPipe có phần Google Developer riêng nơi bạn có thể tìm hiểu thêm về nó và cách sử dụng nó. Rất khuyến khích đọc.


Sự bất hòa của nhóm nhà phát triển Google : Sự bất hòa của nhóm nhà phát triển Google có các kênh dành riêng cho AI sáng tạo. Hãy xem các kênh #gemma, #gemini và #ml để trò chuyện với những người cùng chí hướng.


Ứng dụng Simons Says: Sao chép và chạy mã mẫu cho bài đăng trên blog này để xem nó hoạt động như thế nào. Nó cũng bao gồm việc sử dụng Nhiệm vụ phân loại hình ảnh từ MediaPipe. Hướng dẫn thiết lập có trong README.


Chú thích cuối trang

Đã cập nhật vào ngày 23/03/24 để đề cập đến việc gọi suy luận LLM từ một chuỗi IO


  1. Tôi chợt nhận ra rằng sau khi viết bài này, việc gọi gemma là một thao tác đọc/ghi trên một tệp. Di chuyển phương thức .generateResponse() sang một luồng IO sẽ tránh được tình trạng giật mạnh khi gemma được tải vào bộ nhớ:

     suspend fun sendMessage(): String { return withContext(Dispatchers.IO) { val prompt = prompts.random() llmInference.generateResponse(prompt) } }


Cũng xuất hiện ở đây .