Refresh

This website www.unite.ai/vi/tensorrt-llm-a-comprehensive-guide-to-optimizing-large-language-model-inference-for-maximum-performance/ is currently offline. Cloudflare's Always Online™ shows a snapshot of this web page from the Internet Archive's Wayback Machine. To check for the live version, click Refresh.

Kết nối với chúng tôi

Trí tuệ nhân tạo

TensorRT-LLM: Hướng dẫn toàn diện để tối ưu hóa suy luận mô hình ngôn ngữ lớn để có hiệu suất tối đa

mm

Được phát hành

 on

Lượng tử hóa TensorRT-LLM NVIDEA, hợp nhất hoạt động, độ chính xác FP8 và hỗ trợ đa GPU

Khi nhu cầu về các mô hình ngôn ngữ lớn (LLM) tiếp tục tăng, việc đảm bảo suy luận nhanh chóng, hiệu quả và có thể mở rộng trở nên quan trọng hơn bao giờ hết. NVIDIA TenorRT-LLM bước vào để giải quyết thách thức này bằng cách cung cấp một bộ công cụ mạnh mẽ và tối ưu hóa được thiết kế riêng cho suy luận LLM. TensorRT-LLM cung cấp một loạt các cải tiến hiệu suất ấn tượng, chẳng hạn như lượng tử hóa, hợp nhất hạt nhân, xử lý hàng loạt trong khi bay và hỗ trợ nhiều GPU. Những tiến bộ này giúp đạt được tốc độ suy luận nhanh hơn tới 8 lần so với các phương pháp dựa trên CPU truyền thống, chuyển đổi cách chúng ta triển khai LLM trong sản xuất.

Hướng dẫn toàn diện này sẽ khám phá mọi khía cạnh của TensorRT-LLM, từ kiến ​​trúc và các tính năng chính cho đến các ví dụ thực tế để triển khai các mô hình. Cho dù bạn là kỹ sư AI, nhà phát triển phần mềm hay nhà nghiên cứu, hướng dẫn này sẽ cung cấp cho bạn kiến ​​thức để tận dụng TensorRT-LLM để tối ưu hóa suy luận LLM trên GPU NVIDIA.

Tăng tốc suy luận LLM với TensorRT-LLM

TensorRT-LLM mang lại những cải tiến đáng kể về hiệu suất suy luận LLM. Theo các thử nghiệm của NVIDIA, các ứng dụng dựa trên TensorRT cho thấy 8x nhanh hơn tốc độ suy luận so với nền tảng chỉ sử dụng CPU. Đây là một tiến bộ quan trọng trong các ứng dụng thời gian thực như chatbot, hệ thống đề xuất và hệ thống tự động đòi hỏi phản hồi nhanh.

Phương thức hoạt động

TensorRT-LLM tăng tốc quá trình suy luận bằng cách tối ưu hóa mạng nơ-ron trong quá trình triển khai bằng các kỹ thuật như:

  • Lượng tử hóa: Giảm độ chính xác của trọng số và kích hoạt, thu nhỏ kích thước mô hình và cải thiện tốc độ suy luận.
  • Layer và Tensor Fusion: Kết hợp các phép toán như hàm kích hoạt và phép nhân ma trận thành một phép toán duy nhất.
  • Điều chỉnh hạt nhân: Chọn hạt nhân CUDA tối ưu cho tính toán GPU, giảm thời gian thực hiện.

Những tối ưu hóa này đảm bảo rằng các mô hình LLM của bạn hoạt động hiệu quả trên nhiều nền tảng triển khai khác nhau, từ trung tâm dữ liệu quy mô lớn đến hệ thống nhúng.

Tối ưu hóa hiệu suất suy luận với TensorRT

Được xây dựng trên mô hình lập trình song song CUDA của NVIDIA, TensorRT cung cấp các tối ưu hóa chuyên biệt cao cho suy luận trên GPU NVIDIA. Bằng cách hợp lý hóa các quy trình như lượng tử hóa, điều chỉnh hạt nhân và hợp nhất các hoạt động tensor, TensorRT đảm bảo rằng LLM có thể chạy với độ trễ tối thiểu.

Một số kỹ thuật hiệu quả nhất bao gồm:

  • Lượng tử hóa:Điều này làm giảm độ chính xác số của các tham số mô hình trong khi vẫn duy trì độ chính xác cao, giúp tăng tốc suy luận một cách hiệu quả.
  • Tenor Fusion:Bằng cách kết hợp nhiều hoạt động vào một nhân CUDA duy nhất, TensorRT giảm thiểu chi phí bộ nhớ và tăng thông lượng.
  • Tự động điều chỉnh hạt nhân:TensorRT tự động chọn kernel tốt nhất cho mỗi hoạt động, tối ưu hóa suy luận cho một GPU nhất định.

Các kỹ thuật này cho phép TensorRT-LLM tối ưu hóa hiệu suất suy luận cho các tác vụ học sâu như xử lý ngôn ngữ tự nhiên, công cụ đề xuất và phân tích video thời gian thực.

Tăng tốc khối lượng công việc AI với TensorRT

TensorRT tăng tốc khối lượng công việc học sâu bằng cách kết hợp các tối ưu hóa độ chính xác như INT8FP16. Các định dạng có độ chính xác giảm này cho phép suy luận nhanh hơn đáng kể trong khi vẫn duy trì độ chính xác. Điều này đặc biệt có giá trị trong các ứng dụng thời gian thực, nơi độ trễ thấp là yêu cầu quan trọng.

INT8FP16 việc tối ưu hóa đặc biệt hiệu quả trong:

  • Video Streaming:Các tác vụ xử lý video dựa trên AI, như phát hiện đối tượng, được hưởng lợi từ những tối ưu hóa này bằng cách giảm thời gian xử lý khung hình.
  • Hệ thống khuyến nghị:Bằng cách tăng tốc suy luận cho các mô hình xử lý lượng lớn dữ liệu người dùng, TensorRT cho phép cá nhân hóa theo thời gian thực ở quy mô lớn.
  • Xử lý ngôn ngữ tự nhiên (NLP):TensorRT cải thiện tốc độ của các tác vụ NLP như tạo văn bản, dịch thuật và tóm tắt, khiến chúng phù hợp với các ứng dụng thời gian thực.

Triển khai, chạy và mở rộng quy mô với NVIDIA Triton

Sau khi mô hình của bạn được tối ưu hóa với TensorRT-LLM, bạn có thể dễ dàng triển khai, chạy và mở rộng quy mô bằng cách sử dụng Máy chủ suy luận NVIDIA Triton. Triton là phần mềm nguồn mở hỗ trợ xử lý hàng loạt động, nhóm mô hình và thông lượng cao. Nó cung cấp một môi trường linh hoạt để quản lý các mô hình AI ở quy mô lớn.

Một số tính năng chính bao gồm:

  • Thực hiện mô hình đồng thời: Chạy nhiều mô hình cùng lúc, tối đa hóa việc sử dụng GPU.
  • Lô động: Kết hợp nhiều yêu cầu suy luận thành một đợt, giảm độ trễ và tăng thông lượng.
  • Đầu vào âm thanh/video phát trực tuyến: Hỗ trợ luồng đầu vào trong các ứng dụng thời gian thực, chẳng hạn như phân tích video trực tiếp hoặc dịch vụ chuyển giọng nói thành văn bản.

Điều này khiến Triton trở thành một công cụ có giá trị để triển khai các mô hình được tối ưu hóa TensorRT-LLM trong môi trường sản xuất, đảm bảo khả năng mở rộng và hiệu quả cao.

Các tính năng cốt lõi của TensorRT-LLM cho suy luận LLM

API Python nguồn mở

TensorRT-LLM cung cấp một mô-đun cao và API Python nguồn mở, đơn giản hóa quá trình xác định, tối ưu hóa và thực thi LLM. API cho phép các nhà phát triển tạo LLM tùy chỉnh hoặc sửa đổi các LLM được xây dựng sẵn để phù hợp với nhu cầu của họ, mà không cần kiến ​​thức chuyên sâu về CUDA hoặc các khuôn khổ học sâu.

Phân loại trong chuyến bay và sự chú ý được phân trang

Một trong những tính năng nổi bật của TensorRT-LLM là Phân lô trên chuyến bay, tối ưu hóa việc tạo văn bản bằng cách xử lý nhiều yêu cầu đồng thời. Tính năng này giảm thiểu thời gian chờ và cải thiện việc sử dụng GPU bằng cách sắp xếp chuỗi động.

Ngoài ra, Đã phân trang Chú ý đảm bảo rằng việc sử dụng bộ nhớ vẫn ở mức thấp ngay cả khi xử lý các chuỗi đầu vào dài. Thay vì phân bổ bộ nhớ liền kề cho tất cả các mã thông báo, sự chú ý được phân trang chia bộ nhớ thành các "trang" có thể được sử dụng lại một cách động, ngăn ngừa phân mảnh bộ nhớ và cải thiện hiệu quả.

Suy luận đa GPU và đa nút

Đối với các mô hình lớn hơn hoặc khối lượng công việc phức tạp hơn, TensorRT-LLM hỗ trợ đa GPUsuy luận đa nút. Khả năng này cho phép phân phối các phép tính mô hình trên nhiều GPU hoặc nút, cải thiện thông lượng và giảm thời gian suy luận tổng thể.

Hỗ trợ FP8

Với sự ra đời của FP8 (dấu chấm động 8 bit), TensorRT-LLM tận dụng GPU H100 của NVIDIA để chuyển đổi trọng số mô hình sang định dạng này để suy luận được tối ưu hóa. FP8 cho phép giảm mức tiêu thụ bộ nhớ và tính toán nhanh hơn, đặc biệt hữu ích trong các triển khai quy mô lớn.

Kiến trúc và thành phần TensorRT-LLM

Hiểu được kiến ​​trúc của TensorRT-LLM sẽ giúp bạn tận dụng tốt hơn khả năng của nó để suy luận LLM. Hãy cùng phân tích các thành phần chính:

Định nghĩa mô hình

TensorRT-LLM cho phép bạn định nghĩa LLM bằng cách sử dụng API Python đơn giản. API xây dựng một biểu diễn đồ thị của mô hình, giúp quản lý dễ dàng hơn các lớp phức tạp liên quan đến kiến ​​trúc LLM như GPT hoặc BERT.

Ràng buộc trọng lượng

Trước khi biên dịch mô hình, các trọng số (hoặc tham số) phải được liên kết với mạng. Bước này đảm bảo rằng các trọng số được nhúng trong công cụ TensorRT, cho phép suy luận nhanh và hiệu quả. TensorRT-LLM cũng cho phép cập nhật trọng số sau khi biên dịch, tăng thêm tính linh hoạt cho các mô hình cần cập nhật thường xuyên.

Phù hợp mẫu và hợp nhất

Chiến dịch Fusion là một tính năng mạnh mẽ khác của TensorRT-LLM. Bằng cách hợp nhất nhiều hoạt động (ví dụ, phép nhân ma trận với các hàm kích hoạt) thành một hạt nhân CUDA duy nhất, TensorRT giảm thiểu chi phí liên quan đến việc khởi chạy nhiều hạt nhân. Điều này làm giảm việc truyền bộ nhớ và tăng tốc suy luận.

bổ sung

Để mở rộng khả năng của TensorRT, các nhà phát triển có thể viết bổ sung—các hạt nhân tùy chỉnh thực hiện các nhiệm vụ cụ thể như tối ưu hóa các khối chú ý nhiều đầu. Ví dụ, Flash-Chú ý plugin cải thiện đáng kể hiệu suất của các lớp chú ý LLM.

Điểm chuẩn: Tăng hiệu suất TensorRT-LLM

TensorRT-LLM chứng minh hiệu suất tăng đáng kể cho suy luận LLM trên nhiều GPU khác nhau. Sau đây là so sánh về tốc độ suy luận (được đo bằng token mỗi giây) khi sử dụng TensorRT-LLM trên nhiều GPU NVIDIA khác nhau:

Mô hìnhĐộ chính xácChiều dài đầu vào/đầu raH100 (80GB)A100 (80GB)L40S FP8
GPTJ6BFP8128/12834,95511,2066,998
GPTJ6BFP82048/1282,8001,354747
LLaMA v2 7BFP8128/12816,98510,7256,121
LLaMA v3 8BFP8128/12816,70812,0858,273

Các điểm chuẩn này cho thấy TensorRT-LLM mang lại những cải tiến đáng kể về hiệu suất, đặc biệt là đối với các chuỗi dài hơn.

Thực hành: Cài đặt và xây dựng TensorRT-LLM

Bước 1: Tạo môi trường chứa

Để dễ sử dụng, TensorRT-LLM cung cấp hình ảnh Docker để tạo ra môi trường được kiểm soát cho việc xây dựng và chạy mô hình.

docker build --pull \
             --target devel \
             --file docker/Dockerfile.multi \
             --tag tensorrt_llm/devel:latest .

Bước 2: Chạy Container

Chạy container phát triển với quyền truy cập vào GPU NVIDIA:

docker run --rm -it \
           --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 --gpus=all \
           --volume ${PWD}:/code/tensorrt_llm \
           --workdir /code/tensorrt_llm \
           tensorrt_llm/devel:latest

Bước 3: Xây dựng TensorRT-LLM từ Nguồn

Bên trong container, biên dịch TensorRT-LLM bằng lệnh sau:

python3 ./scripts/build_wheel.py --trt_root /usr/local/tensorrt
pip install ./build/tensorrt_llm*.whl

Tùy chọn này đặc biệt hữu ích khi bạn muốn tránh các vấn đề về khả năng tương thích liên quan đến các phụ thuộc Python hoặc khi tập trung vào tích hợp C++ trong các hệ thống sản xuất. Sau khi quá trình xây dựng hoàn tất, bạn sẽ tìm thấy các thư viện đã biên dịch cho thời gian chạy C++ trong cpp/build/tensorrt_llm thư mục, sẵn sàng tích hợp với các ứng dụng C++ của bạn.

Bước 4: Liên kết TensorRT-LLM C++ Runtime

Khi tích hợp TensorRT-LLM vào các dự án C++ của bạn, hãy đảm bảo rằng các đường dẫn include của dự án trỏ đến cpp/include thư mục. Thư mục này chứa các tiêu đề API ổn định, được hỗ trợ. Các thư viện TensorRT-LLM được liên kết như một phần của quy trình biên dịch C++ của bạn.

Ví dụ: cấu hình CMake của dự án của bạn có thể bao gồm:

include_directories(${TENSORRT_LLM_PATH}/cpp/include)
link_directories(${TENSORRT_LLM_PATH}/cpp/build/tensorrt_llm)
target_link_libraries(your_project tensorrt_llm)

Sự tích hợp này cho phép bạn tận dụng các tối ưu hóa TensorRT-LLM trong các dự án C++ tùy chỉnh của mình, đảm bảo suy luận hiệu quả ngay cả trong môi trường cấp thấp hoặc hiệu suất cao.

Các tính năng nâng cao của TensorRT-LLM

TensorRT-LLM không chỉ là một thư viện tối ưu hóa; nó bao gồm một số tính năng nâng cao giúp giải quyết các triển khai LLM quy mô lớn. Dưới đây, chúng tôi sẽ khám phá chi tiết một số tính năng này:

1. Phân lô trên chuyến bay

Phương pháp phân lô truyền thống đòi hỏi phải đợi cho đến khi thu thập đủ lô trước khi xử lý, điều này có thể gây ra sự chậm trễ. Phân lô trên chuyến bay thay đổi điều này bằng cách bắt đầu suy luận động trên các yêu cầu đã hoàn thành trong một đợt trong khi vẫn thu thập các yêu cầu khác. Điều này cải thiện thông lượng tổng thể bằng cách giảm thiểu thời gian nhàn rỗi và tăng cường sử dụng GPU.

Tính năng này đặc biệt có giá trị trong các ứng dụng thời gian thực, chẳng hạn như chatbot hoặc trợ lý giọng nói, nơi thời gian phản hồi là rất quan trọng.

2. Đã phân trang Chú ý

Đã phân trang Chú ý là một kỹ thuật tối ưu hóa bộ nhớ để xử lý các chuỗi đầu vào lớn. Thay vì yêu cầu bộ nhớ liền kề cho tất cả các mã thông báo trong một chuỗi (có thể dẫn đến phân mảnh bộ nhớ), Paged Attention cho phép mô hình chia dữ liệu bộ đệm khóa-giá trị thành các "trang" bộ nhớ. Các trang này được phân bổ và giải phóng động khi cần, tối ưu hóa việc sử dụng bộ nhớ.

Phân trang có vai trò quan trọng trong việc xử lý chuỗi dài và giảm chi phí bộ nhớ, đặc biệt là trong các mô hình tạo như GPT và LLaMA.

3. Plugin tùy chỉnh

TensorRT-LLM cho phép bạn mở rộng chức năng của nó với plugin tùy chỉnh. Plugin là hạt nhân do người dùng xác định cho phép thực hiện các hoạt động hoặc tối ưu hóa cụ thể không được thư viện TensorRT chuẩn đề cập đến.

Ví dụ, các Flash-Chú ý plugin là một kernel tùy chỉnh nổi tiếng giúp tối ưu hóa các lớp chú ý nhiều đầu trong các mô hình dựa trên Transformer. Bằng cách sử dụng plugin này, các nhà phát triển có thể đạt được tốc độ tăng đáng kể trong tính toán chú ý—một trong những thành phần tốn nhiều tài nguyên nhất của LLM.

Để tích hợp một plugin tùy chỉnh vào mô hình TensorRT-LLM của bạn, bạn có thể viết một kernel CUDA tùy chỉnh và đăng ký nó với TensorRT. Plugin sẽ được gọi trong quá trình thực thi mô hình, cung cấp các cải tiến hiệu suất được điều chỉnh.

4. Độ chính xác FP8 trên NVIDIA H100

Với Độ chính xác FP8, TensorRT-LLM tận dụng những cải tiến phần cứng mới nhất của NVIDIA trong Kiến trúc phễu H100. FP8 giảm dấu chân bộ nhớ của LLM bằng cách lưu trữ trọng số và kích hoạt ở định dạng dấu phẩy động 8 bit, giúp tính toán nhanh hơn mà không làm giảm nhiều độ chính xác. TensorRT-LLM tự động biên dịch các mô hình để sử dụng các hạt nhân FP8 được tối ưu hóa, giúp tăng tốc thời gian suy luận hơn nữa.

Điều này khiến TensorRT-LLM trở thành lựa chọn lý tưởng cho các triển khai quy mô lớn đòi hỏi hiệu suất và hiệu quả năng lượng hàng đầu.

Ví dụ: Triển khai TensorRT-LLM với Triton Inference Server

Đối với việc triển khai sản xuất, NVIDIA Máy chủ suy luận Triton cung cấp một nền tảng mạnh mẽ để quản lý các mô hình ở quy mô lớn. Trong ví dụ này, chúng tôi sẽ trình bày cách triển khai mô hình được tối ưu hóa TensorRT-LLM bằng Triton.

Bước 1: Thiết lập kho lưu trữ mô hình

Tạo một kho lưu trữ mô hình cho Triton, nơi sẽ lưu trữ các tệp mô hình TensorRT-LLM của bạn. Ví dụ, nếu bạn đã biên dịch mô hình GPT2, cấu trúc thư mục của bạn có thể trông như thế này:

mkdir -p model_repository/gpt2/1
cp ./trt_engine/gpt2_fp16.engine model_repository/gpt2/1/

Bước 2: Tạo tệp cấu hình Triton

Trong cùng model_repository/gpt2/ thư mục, tạo một tệp cấu hình có tên config.pbtxt cho Triton biết cách tải và chạy mô hình. Sau đây là cấu hình cơ bản cho TensorRT-LLM:

name: "gpt2"
platform: "tensorrt_llm"
max_batch_size: 8
input [
  {
    name: "input_ids"
    data_type: TYPE_INT32
    dims: [-1]
  }
]
output [
  {
    name: "logits"
    data_type: TYPE_FP32
    dims: [-1, -1]
  }
]

Bước 3: Khởi chạy Triton Server

Sử dụng lệnh Docker sau để khởi chạy Triton với kho lưu trữ mô hình:

docker run --rm --gpus all \
    -v $(pwd)/model_repository:/models \
    nvcr.io/nvidia/tritonserver:23.05-py3 \
    tritonserver --model-repository=/models

Bước 4: Gửi yêu cầu suy luận đến Triton

Khi máy chủ Triton đang chạy, bạn có thể gửi yêu cầu suy luận đến máy chủ đó bằng HTTP hoặc gRPC. Ví dụ, sử dụng curl để gửi yêu cầu:

curl -X POST http://localhost:8000/v2/models/gpt2/infer -d '{
  "inputs": [
    {"name": "input_ids", "shape": [1, 128], "datatype": "INT32", "data": [[101, 234, 1243]]}
  ]
}'

Triton sẽ xử lý yêu cầu bằng công cụ TensorRT-LLM và trả về logit dưới dạng đầu ra.

Các phương pháp hay nhất để tối ưu hóa suy luận LLM với TensorRT-LLM

Để khai thác tối đa sức mạnh của TensorRT-LLM, điều quan trọng là phải tuân theo các biện pháp thực hành tốt nhất trong cả quá trình tối ưu hóa và triển khai mô hình. Sau đây là một số mẹo chính:

1. Hồ sơ mô hình của bạn trước khi tối ưu hóa

Trước khi áp dụng các tối ưu hóa như lượng tử hóa hoặc hợp nhất hạt nhân, hãy sử dụng các công cụ lập hồ sơ của NVIDIA (như Nsight Systems hoặc TensorRT Profiler) để hiểu các điểm nghẽn hiện tại trong quá trình thực thi mô hình của bạn. Điều này cho phép bạn nhắm mục tiêu vào các khu vực cụ thể để cải thiện, dẫn đến tối ưu hóa hiệu quả hơn.

2. Sử dụng Độ chính xác hỗn hợp để có Hiệu suất tối ưu

Khi tối ưu hóa các mô hình với TensorRT-LLM, sử dụng độ chính xác hỗn hợp (sự kết hợp giữa FP16 và FP32) mang lại tốc độ tăng đáng kể mà không làm giảm đáng kể độ chính xác. Để có sự cân bằng tốt nhất giữa tốc độ và độ chính xác, hãy cân nhắc sử dụng FP8 khi có thể, đặc biệt là trên GPU H100.

3. Tận dụng sự chú ý được phân trang cho các chuỗi lớn

Đối với các tác vụ liên quan đến chuỗi đầu vào dài, chẳng hạn như tóm tắt tài liệu hoặc các cuộc hội thoại nhiều lượt, hãy luôn bật Đã phân trang Chú ý để tối ưu hóa việc sử dụng bộ nhớ. Điều này làm giảm chi phí bộ nhớ và ngăn ngừa lỗi hết bộ nhớ trong quá trình suy luận.

4. Tinh chỉnh tính song song cho các thiết lập đa GPU

Khi triển khai LLM trên nhiều GPU hoặc nút, điều cần thiết là phải tinh chỉnh các cài đặt cho tính song song tensorsự song song của đường ống để phù hợp với khối lượng công việc cụ thể của bạn. Cấu hình đúng các chế độ này có thể dẫn đến cải thiện hiệu suất đáng kể bằng cách phân bổ tải tính toán đồng đều trên các GPU.

Kết luận

TensorRT-LLM đại diện cho sự thay đổi mô hình trong việc tối ưu hóa và triển khai các mô hình ngôn ngữ lớn. Với các tính năng tiên tiến như lượng tử hóa, hợp nhất hoạt động, độ chính xác FP8 và hỗ trợ nhiều GPU, TensorRT-LLM cho phép LLM chạy nhanh hơn và hiệu quả hơn trên GPU NVIDIA. Cho dù bạn đang làm việc trên các ứng dụng trò chuyện thời gian thực, hệ thống đề xuất hay các mô hình ngôn ngữ quy mô lớn, TensorRT-LLM cung cấp các công cụ cần thiết để đẩy mạnh ranh giới hiệu suất.

Hướng dẫn này hướng dẫn bạn cách thiết lập TensorRT-LLM, tối ưu hóa các mô hình bằng API Python, triển khai trên Triton Inference Server và áp dụng các phương pháp hay nhất để suy luận hiệu quả. Với TensorRT-LLM, bạn có thể tăng tốc khối lượng công việc AI, giảm độ trễ và cung cấp các giải pháp LLM có thể mở rộng cho môi trường sản xuất.

Để biết thêm thông tin, hãy tham khảo chính thức Tài liệu TensorRT-LLMTài liệu về Triton Inference Server.

Tôi đã dành 50 năm qua để đắm mình trong thế giới hấp dẫn của Học máy và Học sâu. Niềm đam mê và chuyên môn của tôi đã giúp tôi đóng góp cho hơn XNUMX dự án kỹ thuật phần mềm đa dạng, đặc biệt tập trung vào AI/ML. Sự tò mò không ngừng của tôi cũng đã lôi kéo tôi đến với Xử lý ngôn ngữ tự nhiên, một lĩnh vực mà tôi háo hức khám phá thêm.