paint-brush
Chạy Llama mà không cần GPU! LLM lượng tử hóa với LLMWare và Quantized Dragontừ tác giả@shanglun
3,385 lượt đọc
3,385 lượt đọc

Chạy Llama mà không cần GPU! LLM lượng tử hóa với LLMWare và Quantized Dragon

từ tác giả Shanglun Wang12m2024/01/07
Read on Terminal Reader

dài quá đọc không nổi

Khi tài nguyên GPU trở nên hạn chế hơn, việc thu nhỏ và LLM chuyên dụng đang dần trở nên nổi bật. Hôm nay chúng ta khám phá lượng tử hóa, một kỹ thuật thu nhỏ tiên tiến cho phép chúng ta chạy các mô hình có thông số cao mà không cần phần cứng chuyên dụng.
featured image - Chạy Llama mà không cần GPU! LLM lượng tử hóa với LLMWare và Quantized Dragon
Shanglun Wang HackerNoon profile picture
0-item

Giới thiệu

Khi công nghệ LLM được áp dụng phổ biến hơn và hệ sinh thái bắt đầu trưởng thành, các tổ chức bắt đầu nhận ra những giới hạn và chi phí của việc sử dụng công nghệ LLM. Nhiều doanh nghiệp, ban đầu rất hào hứng với việc áp dụng công nghệ LLM , đã từ bỏ các sáng kiến tập trung, thay vào đó theo đuổi chiến lược khuyến khích các nỗ lực phi tập trung để kết hợp các dịch vụ như ChatGPT và Claude vào quy trình làm việc của họ.


Có một số lý do cho hiện tượng này. Thiếu kiến thức chuyên môn về LLM, yêu cầu MLOps và sự phụ thuộc vào cơ sở hạ tầng GPU chuyên dụng đều là những rào cản trong việc triển khai các sáng kiến AI quy mô lớn. Tuy nhiên, trong số này, vấn đề gai góc nhất là sự phụ thuộc vào GPU.


Trong bài viết này, chúng ta sẽ thảo luận về những khó khăn cụ thể do sự phụ thuộc vào GPU gây ra, khám phá một giải pháp tiềm năng và xem xét một ví dụ thú vị từ một trong những công ty đi đầu hoạt động trong lĩnh vực này.

Tính khả dụng của GPU là hạn chế đối với LLM


Hầu hết các mẫu có hiệu suất cao và được cung cấp công khai, chẳng hạn như GPT-4, Llama 2 và Claude, đều dựa trên cơ sở hạ tầng GPU chuyên dụng cao. GPT-4, một trong những mẫu lớn nhất hiện có trên thị trường, nổi tiếng chạy trên cụm 8 GPU A100. Model 70B của Llama 2 nhỏ hơn nhiều nhưng vẫn cần ít nhất GPU A40 để chạy ở tốc độ hợp lý.


Mức yêu cầu GPU này trên thực tế đã hạn chế khả năng chạy cục bộ các mô hình này - GPU A100, giả sử bạn có thể tìm được người bán, có giá gần 25.000 USD. Sau khi có được GPU, bạn cần có các kỹ năng chuyên môn để thiết lập và bảo trì máy chủ. Rất ít tổ chức sẵn sàng bỏ ra một khoản kinh phí như vậy để thử nghiệm các công nghệ LLM.


Để giải quyết vấn đề này, một số công ty khởi nghiệp và nhà cung cấp đám mây đã phát triển các dịch vụ PaaS mở rộng. Một số dịch vụ như Replica mà tôi đã sử dụng trong các bài viết và dự án trước đây, cho phép người dùng thuê máy chủ GPU và trả tiền cho thời gian tính toán đã sử dụng. Các nhà cung cấp khác, như OpenAI và Anthropic, cung cấp mô hình của họ dưới dạng API cho mỗi mã thông báo, giúp loại bỏ sự phức tạp về cơ sở hạ tầng hơn nữa. Tuy nhiên, các dịch vụ này yêu cầu dữ liệu phải được gửi đến mạng bên ngoài, điều này khiến việc sử dụng các dịch vụ này trở thành điều không thể bắt đầu đối với các tổ chức quan tâm đến quyền riêng tư. Ngoài ra, nhiều dịch vụ trong số này bị thiếu hụt khi nhu cầu tăng đột biến do mức sử dụng GPU vượt quá mức sẵn có, khiến chúng trở thành lựa chọn không đáng tin cậy cho khối lượng công việc quan trọng trong sản xuất.


Ngoài ra, thời gian sử dụng GPU, bất kể được tính phí như thế nào, đều rất tốn kém đối với các tác vụ tính toán lớn - xét cho cùng, các công ty sở hữu và vận hành những GPU này cần có lợi tức đầu tư. Mặc dù các chi phí này gần như không đáng kể đối với các trường hợp sử dụng thử nghiệm, nhưng các trường hợp sử dụng thương mại thường yêu cầu nhúng các bối cảnh lớn, tinh chỉnh hoặc ví dụ nhiều ảnh. Những chi phí này là rào cản đáng kể trong việc áp dụng, đặc biệt đối với các tổ chức có bộ dữ liệu lớn hoặc những tổ chức thiếu nguồn tài chính như các công ty lớn của Hoa Kỳ.


Trong bài viết trước, chúng tôi đã khám phá tính năng nén tham số như một chiến lược nhằm giảm sự phụ thuộc vào GPU. Trong bài viết hôm nay, chúng ta sẽ khám phá một kỹ thuật thú vị khác gọi là lượng tử hóa.


Tuy nhiên, trước khi đi sâu vào khám phá, trước tiên chúng ta có thể muốn tìm hiểu một chút về lượng tử hóa.

Lượng tử hóa (Đọc tùy chọn)

Trong phần này, chúng ta sẽ tìm hiểu ngắn gọn những điều cơ bản về lượng tử hóa. Tuy nhiên, nếu bạn chỉ đơn giản đang tìm cách chạy LLM mạnh mẽ cục bộ trên máy tính của mình, bạn có thể bỏ qua phần này ngay bây giờ và quay lại sau. LLMWare, công ty có công nghệ mà chúng ta sẽ sử dụng ngày nay, đã xây dựng một số công cụ tuyệt vời cho phép bạn bắt đầu với các mô hình lượng tử hóa mà không cần phải đi sâu vào các triển khai C/C++ phức tạp đằng sau nó.

Lượng tử hóa là gì?

Lượng tử hóa là một kỹ thuật nhằm giảm các yêu cầu về tính toán và bộ nhớ khi chạy LLM bằng cách sử dụng các kiểu số có độ chính xác thấp hơn. Nhiều mô hình nguồn mở phổ biến, chẳng hạn như Llama, Falcon và Alpaca, sử dụng PyTorch làm khung cơ bản. Theo mặc định, mô hình PyTorch sử dụng dấu phẩy động 32 bit, nghĩa là một tham số duy nhất chiếm 32 “bit” trong bộ nhớ GPU. Lượng tử hóa nhằm mục đích thay thế các tham số này bằng các dấu phẩy động 16 bit, số nguyên 8 bit hoặc thậm chí số nguyên 4 bit. Lượng tử hóa thành công dẫn đến những cải thiện đáng kể về tốc độ tính toán và giảm mức sử dụng bộ nhớ, nghĩa là các mô hình lớn có thể chạy được trên GPU cấp thấp hơn, chip đồ họa nhúng hoặc thậm chí cả CPU. Ý tưởng này đã xuất hiện được một thời gian - bản thân PyTorch đã bổ sung hỗ trợ cho các dấu phẩy động 16-bit và tổng hợp mô hình khi công nghệ này hoàn thiện, nhưng tiến độ còn chậm do các quyết định thiết kế ban đầu trong khung PyTorch.

Lượng tử hóa có làm giảm hiệu suất không?

Tại thời điểm này, điều tự nhiên là bạn sẽ tự hỏi liệu điều này có làm giảm nghiêm trọng độ chính xác của mô hình không? Câu trả lời ngắn gọn là có, nhưng chỉ khi bạn làm điều đó một cách bất cẩn. Mọi tối ưu hóa đều đi kèm với những đánh đổi cố hữu, nhưng với một số kỹ thuật chuyên biệt, các nhà nghiên cứu đã có thể đạt được hiệu suất cực kỳ ổn định từ các mô hình lượng tử hóa cao. Mặc dù chúng tôi sẽ không đi sâu vào chi tiết kỹ thuật nhưng chúng ta hãy điểm qua những nét khái quát về các chiến lược phổ biến nhất đang được sử dụng hiện nay. Nếu muốn tìm hiểu thêm, bạn có thể tìm hiểu thêm về nó trong hướng dẫn từ HuggingFace.


Lượng tử hóa đã hiệu chỉnh

Trong quá trình lượng tử hóa, một tập dữ liệu hiệu chuẩn sẽ được chạy qua mô hình. Giá trị của từng tham số được ghi lại và phạm vi được sử dụng để xác định cách lượng tử hóa các tham số. Giả sử tập dữ liệu hiệu chuẩn đại diện cho các đầu vào mà mô hình sẽ gặp, điều này sẽ giúp cải thiện độ chính xác của mô hình thu được.


Lượng tử hóa-Nhận thức

Trong khi Lượng tử hóa được hiệu chỉnh xảy ra sau khi đào tạo, thì Đào tạo nhận biết lượng tử hóa cố gắng tối ưu hóa mô hình trong quá trình đào tạo. Trong khi mô hình đang được đào tạo, các kích hoạt được thực hiện thông qua "lượng tử hóa giả", mô phỏng các lỗi có thể sẽ được tạo ra bởi quá trình lượng tử hóa. Sau đó, mô hình có thể thích ứng với các lỗi, tạo ra một mô hình mạnh mẽ hơn có thể thích ứng cụ thể với các biến dạng tiềm ẩn.

Llama.cpp và GGUF

Trong khi việc lượng tử hóa và tối ưu hóa PyTorch từ lâu đã bị chặn bởi thiết kế khung, hai công nghệ nguồn mở gần đây đã vượt qua những rào cản này và làm cho công nghệ lượng tử hóa dễ tiếp cận hơn nhiều với công chúng. Hãy trình bày ngắn gọn chúng dưới đây.


Llama.cpp

Llama.cpp là một dự án của Georgi Gerganov nhằm chuyển mô hình Llama sang C/C++. Điều này đã loại bỏ sự phức tạp do PyTorch giới thiệu và việc triển khai gốc cho phép thực hiện lượng tử hóa trực tiếp. Do đó, mô hình kết quả có thể chạy với lượng tử hóa số nguyên lên tới 4 bit, cho phép chạy các mô hình Llama có số lượng tham số cao mà không cần GPU chuyên dụng.


Dự án kể từ đó đã được cộng đồng mở rộng để bao gồm một danh sách các mô hình nguồn mở, bao gồm cả những mô hình phổ biến như Falcon và Mistral.


GGUF

GGUF là định dạng tệp của Llama.cpp để lưu trữ và truyền thông tin mô hình. Các mô hình lượng tử hóa được lưu trữ ở định dạng này để người dùng cuối có thể tải và chạy chúng. GGUF là định dạng kế thừa của GGML và nhằm mục đích cải thiện GGML bằng cách cung cấp nhiều khả năng mở rộng hơn, khả năng tương thích ngược và độ ổn định trong khi vẫn cho phép phát triển nhanh chóng.


Sự phát triển của định dạng tệp phổ quát đã mở ra cơ hội cho cộng đồng nguồn mở mở rộng Llama.cpp để tối ưu hóa các mô hình khác và các nhà đổi mới như TheBloke và LLMWare đã làm việc trong vài tháng qua để thu nhỏ các mô hình nguồn mở phổ biến.

Mô hình rồng lượng tử hóa của LLMWare

Trong ví dụ hôm nay, chúng ta sẽ sử dụng các thư viện nguồn mở và các mô hình lượng tử hóa do LLMWare cung cấp, cung cấp các công cụ thuận tiện để nhanh chóng xây dựng các quy trình công việc RAG chuyên dụng.

LLMWare là ai?

LLMWare, một công ty AI chuyên về lĩnh vực pháp lý và tài chính, đã tích cực tham gia vào cộng đồng lượng tử hóa. Như tôi đã viết trước đây, việc họ tập trung vào các lĩnh vực quan tâm đến quyền riêng tư khiến họ trở thành ứng cử viên đương nhiên để thử nghiệm và đổi mới các công nghệ thu nhỏ.


Trước đây, tôi đã viết về các mô hình BLING được tối ưu hóa RAG của họ giúp đạt được hiệu suất đáng kinh ngạc từ 1 đến 3 tỷ mô hình tham số cho các nhiệm vụ chuyên biệt như xem xét hợp đồng và phân tích tài chính. Trong khi hầu hết các mô hình nguồn mở có số lượng tham số như vậy có xu hướng chỉ hữu ích cho các vấn đề về đồ chơi, LLMWare có thể tạo ra hiệu suất sẵn sàng sản xuất từ các mô hình này bằng cách huấn luyện chúng cho các nhiệm vụ được nhắm mục tiêu hẹp. Sau đó, các mô hình thu nhỏ này có thể chạy mà không cần GPU bên ngoài, cho phép tăng cường quyền riêng tư và khả năng mở rộng.

Rồng là gì?

Dragon là một tập hợp các LLM có thể được coi là phiên bản mạnh mẽ hơn của người anh em BLING của chúng. Mục đích ban đầu của Dragon là đào tạo một mô hình tham số cao hơn bằng cách sử dụng các kỹ thuật tinh chỉnh hướng dẫn tương tự, cung cấp tùy chọn cho những người dùng cần hiệu suất cao hơn và có quyền truy cập vào GPU cấp thấp hơn.


Số lượng tham số được thêm vào dẫn đến các mô hình mạnh mẽ hơn có thể tận dụng các cửa sổ ngữ cảnh lớn hơn và tạo ra các kết quả đầu ra phức tạp hơn nhưng yêu cầu người dùng phải có phần cứng chuyên dụng hơn, chẳng hạn như máy tính xách tay nhúng GPU hoặc bộ chứa điện toán đám mây có gắn GPU. Tuy nhiên, chúng vẫn thể hiện sự cải tiến so với các mẫu cực lớn vốn yêu cầu phải chờ truy cập vào GPU A40 hoặc A100 khan hiếm.

Rồng lượng tử hóa, thứ tốt nhất của cả hai thế giới

Với những điều trên, thật dễ hiểu tại sao lượng tử hóa lại mang lại sự thúc đẩy đáng kể cho bộ công cụ AI của LLMWare. Với lượng tử hóa, người dùng có thể chạy các mô hình cấp Dragon trên cùng môi trường với các mô hình BLING, cho phép phân tích mạnh mẽ hơn nhiều trên các máy tính thông thường.


Trong suốt tháng qua, LLMWare đã xuất bản phiên bản lượng tử hóa của một số mẫu Dragon. Hôm nay, chúng ta sẽ đánh giá mô hình Dragon của LLMWare được xây dựng dựa trên Llama với bài toán RAG phân tích pháp lý và so sánh nó với mô hình BLING tương tự. Những người tiếp cận quan tâm cũng có thể khám phá các mô hình khác - mô hình dựa trên Mistral và mô hình dựa trên Yi hiện có sẵn từ LLMWare tại thời điểm viết bài này. Ngoài ra, LLMWare đã giúp việc chạy suy luận trên các mô hình Llama.cpp trở nên dễ dàng nhờ sự tích hợp chặt chẽ của chúng với thư viện ctransformers, cho phép các mô hình gguf được hoán đổi liền mạch với các mô hình dựa trên PyTorch.


Chúng tôi sẽ sử dụng Macbook Air có Chip M1 cho thử nghiệm này, nghĩa là chúng tôi sẽ chỉ sử dụng phần cứng có sẵn rộng rãi cho bài tập này.

Thử nghiệm lượng tử hóa rồng

Hãy nhớ rằng trong bài viết trước của tôi, chúng tôi đã xây dựng một ứng dụng RAG tập trung vào tìm kiếm pháp luật. Chúng tôi đã sử dụng tìm kiếm vectơ để nhanh chóng tìm kiếm thông qua một số luật lớn, tìm thấy các phần có liên quan đến câu hỏi của chúng tôi về Sở thích đối tác trong Vùng cơ hội đủ điều kiện và chạy câu hỏi thông qua mô hình BLING. Trong bài viết hôm nay, chúng ta sẽ thực hiện câu hỏi tương tự thông qua mô hình Dragon được lượng tử hóa của LLMWare và xác định xem nó có hoạt động tốt hơn mô hình BLING hay không.


Để tập trung vào việc so sánh mô hình và giảm lượng kiến thức cần có trước đó, chúng tôi sẽ thực hiện nhiều thao tác phân tích cú pháp PDF và tìm kiếm vectơ theo cách thủ công. Điều này có thêm lợi ích là làm cho vấn đề trở nên khó khăn hơn một cách giả tạo đối với mô hình - tìm kiếm nhúng mặc định của LLMWare chia tài liệu nguồn thành khoảng 1000 mã thông báo, nhưng việc xử lý phân tích cú pháp theo cách thủ công cho phép chúng tôi tăng ngữ cảnh lên tới khoảng 3000 mã thông báo. Điều này sẽ giúp chúng ta thể hiện rõ ràng sự khác biệt giữa mẫu Dragon và BLING.


Tuy nhiên, bạn có thể dễ dàng tích hợp với phần còn lại của hệ sinh thái LLMWare nếu bạn muốn tận dụng các công cụ của họ bằng cách làm theo các bước thiết lập từ bài viết trước của tôi về LLMWare. Trên thực tế, nếu bạn chỉ cần thay thế tên của mô hình BLING bằng mô hình Dragon được lượng tử hóa trong bài viết này, mọi thứ sẽ hoạt động liền mạch.


Không dài dòng nữa, hãy bắt đầu!


Trước tiên, hãy nhập các phụ thuộc cần thiết:


 import sklearn import sklearn.metrics # for cosine similarity from llmware.prompts import Prompt import time import os from openai import OpenAI from PyPDF2 import PdfReader client = OpenAI() # the library now loads the key automatically as an environment variable.


Bây giờ chúng ta có thể tải PDF. Trong ví dụ trước, chúng tôi đã tải một số đạo luật lớn, nhưng hôm nay, chúng tôi sẽ chỉ tập trung vào phiên bản PDF của Đạo luật Việc làm và Cắt giảm Thuế năm 2017.

 reader = PdfReader([path to PDF of tax cuts and jobs act])


Bây giờ chúng ta có thể tạo các phần nhúng cho mỗi trang:

 embeddings = [] for pg in reader.pages: text = pg.extract_text() embeddings.append(client.embeddings.create( input=text, model="text-embedding-ada-002" ).data[0].embedding)


Chúng ta cũng hãy tạo các phần nhúng cho câu hỏi mà chúng ta sắp hỏi:

 question = 'What is a qualified opportunity zone partnership interest?' q_embed = client.embeddings.create( input=question, model="text-embedding-ada-002" ).data[0].embedding


Với khả năng nhúng trong tay, chúng ta có thể thực hiện tìm kiếm vectơ. Vì không gian tìm kiếm của chúng tôi nhỏ nên chúng tôi chỉ có thể thực hiện việc này một cách thủ công.


 cos_sim = [(idx, sklearn.metrics.pairwise.cosine_similarity([e], [q_embed])[0][0]) for idx, e in enumerate(embeddings)]


Bây giờ chúng ta có thể lấy trang phù hợp nhất (là chỉ mục 132 hoặc trang 133 nếu bạn muốn xác minh kết quả):

 most_relevant = sorted(cos_sim, key=lambda x: x[1], reverse=True)[0][0]


Và với điều đó, chúng ta đã đi đến bước quan trọng nhất. Chúng ta sẽ khởi tạo một đối tượng LLMWare Nhắc nhở bằng mô hình Llama Dragon được lượng tử hóa. Lớp Nhắc nhở ở đây rất quan trọng vì nó xử lý kỹ thuật nhắc nhở cho chúng ta và đảm bảo rằng lời nhắc của chúng ta nhất quán với cấu trúc dữ liệu huấn luyện của Dragon. Lớp nhắc cũng tự động xử lý liên kết llamacpp, vì vậy bạn có thể sử dụng mô hình Dragon được lượng tử hóa giống hệt như các mô hình khác.


 model_name = "llmware/dragon-llama-7b-gguf" prompter = Prompt().load_model(model_name) response = prompter.prompt_main(question, context='\n\n'.join([reader.pages[132].extract_text()]), prompt_name="default_with_context", temperature=0.3)


Đợi một lát và bạn sẽ thấy lệnh gọi hàm trả về. Bây giờ in kết quả:

 print(response['llm_response'])


Và bạn sẽ thấy một cái gì đó như sau:

 • A capital or profits interest acquired by the qualified opportunity fund after December 31, 2017, from the partnership solely in exchange for cash; •As of the time such interest was acquired, the partnership was a qualified opportunity zone business (or, in the case of a new partnership, it was being organized for purposes of being a qualified opportunity zone business); •During substantially all of the qualified opportunity fund's holding period for such interest, the partnership qualified as a qualified opportunity zone business.


Đây là một câu trả lời khá tốt!


Để so sánh, chúng ta hãy xem mô hình BLING sẽ hoạt động như thế nào trong cùng một vấn đề. Một trong những vấn đề mà chúng ta có thể mong đợi là kích thước ngữ cảnh lớn có thể “lấn át” mô hình có tham số thấp hơn và dẫn đến câu trả lời ít thông tin hơn. Trong các thử nghiệm trước đây của tôi, lạc đà không bướu 2.7b bị cắt lông là một trong những loài thể hiện tốt nhất vấn đề này, vì vậy tôi quyết định sử dụng nó làm đại diện cho mô hình BLING.

 model_name_2 = "llmware/bling-sheared-llama-2.7b-0.1" prompter2 = Prompt().load_model(model_name_2) response = prompter2.prompt_main(question, context='\n\n'.join([reader.pages[132].extract_text()]), prompt_name="default_with_context", temperature=0.3)


Sau một số xử lý, bạn sẽ thấy một cái gì đó như thế này.


 A qualified opportunity zone partnership interest is a capital or profits interest in a domestic partnership if such interest is acquired by the qualified opportunity fund after December 31, 2017, from the partnership solely in exchange for cash.


Phản hồi vẫn tốt nhưng thiếu một số chi tiết được mô hình Dragon nắm bắt. Cụ thể, câu trả lời thiếu yêu cầu về thời gian nắm giữ và trường hợp kinh doanh mới. Điều này phù hợp với mong đợi của chúng tôi về khó khăn của các mô hình tham số thấp hơn khi xử lý các bối cảnh lớn hơn. Độc giả quan tâm có thể mở rộng thử nghiệm này bằng cách sử dụng các mô hình tham số thấp hơn hoặc tăng kích thước của bối cảnh nhất định. Bạn sẽ thấy hiệu ứng ngày càng rõ rệt hơn, sau đó người mẫu sẽ đưa ra một câu trả lời ngắn gọn, bị cắt xén.


Từ thử nghiệm này, có thể thấy rõ rằng các mô hình Dragon được lượng tử hóa có thể hoạt động tốt hơn các mô hình có tham số thấp hơn cho các trường hợp sử dụng dự định của chúng mà không ảnh hưởng đáng kể đến độ chính xác của mô hình.


Và cùng với đó, chúng tôi đã sử dụng mô hình lượng tử hóa để giải quyết trường hợp sử dụng trong thế giới thực và tìm hiểu về các đặc tính hiệu suất của nó trong quy trình!

Phần kết luận

Hôm nay, chúng ta đã khám phá lĩnh vực lượng tử hóa LLM thú vị và xem xét cách các công ty như LLMWare đang tận dụng những phát triển này để nâng cao các mô hình ngôn ngữ chuyên biệt của họ. Như tôi đã tranh luận trước đây, thu nhỏ đại diện cho một trong những con đường hứa hẹn nhất để áp dụng rộng rãi công nghệ AI. Bằng cách kết hợp chuyên môn hóa, tinh chỉnh và lượng tử hóa, các nhà đổi mới trong không gian AI có thể tạo ra các mô hình hiệu quả và có thể mở rộng để giải quyết các vấn đề trong thế giới thực.


Bạn có thể tìm thấy khung RAG của LLMWare trên Github và các mô hình DRAGON và BLING của chúng trên kho lưu trữ Hugging Face của LLMWare.


Nhân tiện, tôi đang thực hiện một dự án thú vị nhằm tìm cách sử dụng ngôn ngữ AI và thu nhỏ để cách mạng hóa giáo dục ở các nước đang phát triển. Chúng tôi đang làm việc với các nhà hoạt động và nhà giáo dục xuất sắc trên toàn thế giới và chúng tôi đang nỗ lực thu hẹp khoảng cách kỹ thuật số toàn cầu. Nếu bạn muốn tìm hiểu thêm về dự án của tôi hoặc chỉ muốn nói về những phát triển thú vị trong không gian LLM, vui lòng liên hệ với tôi trên Github hoặc LinkedIn .