Logo Zephyrnet

Giảm thời gian suy luận cho các mô hình BERT bằng cách sử dụng tìm kiếm kiến ​​trúc thần kinh và Điều chỉnh mô hình tự động của SageMaker | Dịch vụ web của Amazon

Ngày:

Trong bài đăng này, chúng tôi trình bày cách sử dụng tính năng cắt tỉa cấu trúc dựa trên tìm kiếm kiến ​​trúc thần kinh (NAS) để nén mô hình BERT tinh chỉnh nhằm cải thiện hiệu suất mô hình và giảm thời gian suy luận. Các mô hình ngôn ngữ được đào tạo trước (PLM) đang được áp dụng nhanh chóng trong thương mại và doanh nghiệp trong các lĩnh vực công cụ năng suất, dịch vụ khách hàng, tìm kiếm và đề xuất, tự động hóa quy trình kinh doanh và tạo nội dung. Việc triển khai các điểm cuối suy luận PLM thường đi kèm với độ trễ cao hơn và chi phí cơ sở hạ tầng cao hơn do yêu cầu tính toán và giảm hiệu quả tính toán do số lượng tham số lớn. Việc cắt bớt PLM làm giảm kích thước và độ phức tạp của mô hình trong khi vẫn giữ được khả năng dự đoán của nó. PLM được cắt bớt đạt được dung lượng bộ nhớ nhỏ hơn và độ trễ thấp hơn. Chúng tôi chứng minh điều đó bằng cách cắt bớt PLM và loại bỏ lỗi xác thực cũng như số lượng tham số cho một tác vụ mục tiêu cụ thể và có thể đạt được thời gian phản hồi nhanh hơn khi so sánh với mô hình PLM cơ sở.

Tối ưu hóa đa mục tiêu là một lĩnh vực ra quyết định tối ưu hóa nhiều chức năng mục tiêu, chẳng hạn như mức tiêu thụ bộ nhớ, thời gian đào tạo và tài nguyên tính toán, để được tối ưu hóa đồng thời. Cắt tỉa cấu trúc là một kỹ thuật nhằm giảm kích thước và yêu cầu tính toán của PLM bằng cách cắt tỉa các lớp hoặc nơ-ron/nút trong khi cố gắng duy trì độ chính xác của mô hình. Bằng cách loại bỏ các lớp, việc cắt tỉa cấu trúc đạt được tốc độ nén cao hơn, dẫn đến sự thưa thớt về cấu trúc thân thiện với phần cứng giúp giảm thời gian chạy và thời gian phản hồi. Việc áp dụng kỹ thuật cắt bớt cấu trúc cho mô hình PLM sẽ tạo ra một mô hình có trọng lượng nhẹ hơn với mức sử dụng bộ nhớ thấp hơn, khi được lưu trữ dưới dạng điểm cuối suy luận trong SageMaker, sẽ mang lại hiệu quả sử dụng tài nguyên được cải thiện và giảm chi phí khi so sánh với PLM được tinh chỉnh ban đầu.

Các khái niệm được minh họa trong bài đăng này có thể được áp dụng cho các ứng dụng sử dụng tính năng PLM, chẳng hạn như hệ thống đề xuất, phân tích tình cảm và công cụ tìm kiếm. Cụ thể, bạn có thể sử dụng phương pháp này nếu bạn có các nhóm khoa học dữ liệu và học máy (ML) chuyên dụng để tinh chỉnh các mô hình PLM của riêng họ bằng cách sử dụng bộ dữ liệu dành riêng cho miền và triển khai một số lượng lớn điểm cuối suy luận bằng cách sử dụng Amazon SageMaker. Một ví dụ là một nhà bán lẻ trực tuyến triển khai một số lượng lớn điểm cuối suy luận để tóm tắt văn bản, phân loại danh mục sản phẩm và phân loại cảm tính phản hồi sản phẩm. Một ví dụ khác có thể là nhà cung cấp dịch vụ chăm sóc sức khỏe sử dụng điểm cuối suy luận PLM để phân loại tài liệu lâm sàng, nhận dạng thực thể được đặt tên từ các báo cáo y tế, chatbot y tế và phân tầng rủi ro bệnh nhân.

Tổng quan về giải pháp

Trong phần này, chúng tôi trình bày quy trình làm việc tổng thể và giải thích cách tiếp cận. Đầu tiên, chúng tôi sử dụng một Xưởng sản xuất Amazon SageMaker máy tính xách tay để tinh chỉnh mô hình BERT được đào tạo trước cho một nhiệm vụ mục tiêu bằng cách sử dụng tập dữ liệu dành riêng cho miền. Chứng nhận (Biểu diễn bộ mã hóa hai chiều từ Transformers) là một mô hình ngôn ngữ được đào tạo trước dựa trên kiến trúc máy biến áp được sử dụng cho các tác vụ xử lý ngôn ngữ tự nhiên (NLP). Tìm kiếm kiến ​​trúc thần kinh (NAS) là một phương pháp tự động hóa thiết kế mạng lưới thần kinh nhân tạo và có liên quan chặt chẽ đến tối ưu hóa siêu tham số, một phương pháp được sử dụng rộng rãi trong lĩnh vực học máy. Mục tiêu của NAS là tìm ra kiến ​​trúc tối ưu cho một vấn đề nhất định bằng cách tìm kiếm trên một tập hợp lớn các kiến ​​trúc ứng viên bằng cách sử dụng các kỹ thuật như tối ưu hóa không có độ dốc hoặc bằng cách tối ưu hóa các số liệu mong muốn. Hiệu suất của kiến ​​trúc thường được đo bằng các số liệu như mất xác thực. Điều chỉnh mô hình tự động SageMaker (AMT) tự động hóa quy trình tẻ nhạt và phức tạp để tìm ra sự kết hợp tối ưu giữa các siêu tham số của mô hình ML nhằm mang lại hiệu suất mô hình tốt nhất. AMT sử dụng các thuật toán tìm kiếm thông minh và đánh giá lặp lại bằng cách sử dụng nhiều siêu tham số mà bạn chỉ định. Nó chọn các giá trị siêu tham số để tạo ra một mô hình hoạt động tốt nhất, được đo bằng các số liệu hiệu suất như độ chính xác và điểm F-1.

Cách tiếp cận tinh chỉnh được mô tả trong bài đăng này là chung chung và có thể áp dụng cho bất kỳ tập dữ liệu dựa trên văn bản nào. Nhiệm vụ được giao cho BERT PLM có thể là nhiệm vụ dựa trên văn bản, chẳng hạn như phân tích cảm xúc, phân loại văn bản hoặc Hỏi đáp. Trong bản demo này, nhiệm vụ mục tiêu là một vấn đề phân loại nhị phân trong đó BERT được sử dụng để xác định, từ tập dữ liệu bao gồm một tập hợp các cặp đoạn văn bản, liệu ý nghĩa của một đoạn văn bản có thể được suy ra từ đoạn văn bản kia hay không. Chúng tôi sử dụng Nhận biết tập dữ liệu về yêu cầu văn bản từ bộ điểm chuẩn GLUE. Chúng tôi thực hiện tìm kiếm đa mục tiêu bằng SageMaker AMT để xác định các mạng con mang lại sự cân bằng tối ưu giữa số lượng tham số và độ chính xác dự đoán cho tác vụ mục tiêu. Khi thực hiện tìm kiếm đa mục tiêu, chúng tôi bắt đầu bằng việc xác định độ chính xác và số lượng tham số là mục tiêu mà chúng tôi hướng tới tối ưu hóa.

Trong mạng BERT PLM, có thể có các mạng con độc lập, theo mô-đun cho phép mô hình có các khả năng chuyên biệt như hiểu ngôn ngữ và biểu diễn kiến ​​thức. BERT PLM sử dụng mạng con tự chú ý nhiều đầu và mạng con chuyển tiếp nguồn cấp dữ liệu. Lớp tự chú ý, nhiều đầu cho phép BERT liên kết các vị trí khác nhau của một chuỗi để tính toán cách biểu diễn chuỗi bằng cách cho phép nhiều đầu tham dự vào nhiều tín hiệu ngữ cảnh. Đầu vào được chia thành nhiều không gian con và tính năng tự chú ý được áp dụng riêng cho từng không gian con. Nhiều đầu trong PLM máy biến áp cho phép mô hình cùng tham gia vào thông tin từ các không gian con biểu diễn khác nhau. Mạng con chuyển tiếp nguồn cấp dữ liệu là mạng thần kinh đơn giản lấy đầu ra từ mạng con tự chú ý nhiều đầu, xử lý dữ liệu và trả về các biểu diễn bộ mã hóa cuối cùng.

Mục tiêu của việc lấy mẫu mạng con ngẫu nhiên là huấn luyện các mô hình BERT nhỏ hơn có thể thực hiện đủ tốt các nhiệm vụ mục tiêu. Chúng tôi lấy mẫu 100 mạng con ngẫu nhiên từ mô hình BERT cơ sở đã được tinh chỉnh và đánh giá đồng thời 10 mạng. Các mạng con được đào tạo được đánh giá về các số liệu khách quan và mô hình cuối cùng được chọn dựa trên sự cân bằng được tìm thấy giữa các số liệu khách quan. Chúng tôi hình dung ra Mặt trước Pareto đối với các mạng con được lấy mẫu, chứa mô hình được cắt bớt mang lại sự cân bằng tối ưu giữa độ chính xác của mô hình và kích thước mô hình. Chúng tôi chọn mạng con ứng cử viên (mô hình BERT được cắt bớt bởi NAS) dựa trên kích thước mô hình và độ chính xác của mô hình mà chúng tôi sẵn sàng đánh đổi. Tiếp theo, chúng tôi lưu trữ các điểm cuối, mô hình cơ sở BERT được đào tạo trước và mô hình BERT được cắt bớt trên NAS bằng SageMaker. Để thực hiện kiểm tra tải, chúng tôi sử dụng giống châu chấu, một công cụ kiểm tra tải nguồn mở mà bạn có thể triển khai bằng Python. Chúng tôi chạy thử nghiệm tải trên cả hai điểm cuối bằng Locust và trực quan hóa kết quả bằng cách sử dụng mặt trước Pareto để minh họa sự cân bằng giữa thời gian phản hồi và độ chính xác cho cả hai mô hình. Sơ đồ sau đây cung cấp cái nhìn tổng quan về quy trình làm việc được giải thích trong bài đăng này.

Quy trình làm việc

Điều kiện tiên quyết

Đối với bài đăng này, các điều kiện tiên quyết sau đây là bắt buộc:

Bạn cũng cần phải tăng hạn ngạch dịch vụ để truy cập ít nhất ba phiên bản ml.g4dn.xlarge trong SageMaker. Loại phiên bản ml.g4dn.xlarge là phiên bản GPU tiết kiệm chi phí cho phép bạn chạy PyTorch nguyên bản. Để tăng hạn ngạch dịch vụ, hãy hoàn thành các bước sau:

  1. Trên bảng điều khiển, điều hướng đến Định mức dịch vụ.
  2. Trong Quản lý hạn ngạch, chọn Amazon SageMaker, sau đó chọn Xem hạn ngạch.

  1. Tìm kiếm “ml-g4dn.xlarge để sử dụng cho công việc đào tạo” và chọn mục hạn ngạch.
  2. Chọn Yêu cầu tăng ở cấp tài khoản.

  1. Trong Tăng giá trị hạn ngạch, hãy nhập giá trị từ 5 trở lên.
  2. Chọn Yêu cầu.

Việc phê duyệt hạn ngạch được yêu cầu có thể mất một chút thời gian để hoàn thành tùy thuộc vào quyền của tài khoản.

  1. Mở SageMaker Studio từ bảng điều khiển SageMaker.

  1. Chọn Thiết bị đầu cuối hệ thống Dưới Các tiện ích và tệp.

  1. Chạy lệnh sau để sao chép Repo GitHub đến phiên bản SageMaker Studio:
    git clone https://github.com/aws/amazon-sagemaker-examples.git

  2. Hướng đến amazon-sagemaker-examples/hyperparameter_tuning/neural_architecture_search_llm.
  3. Mở tập tin nas_for_llm_with_amt.ipynb.
  4. Thiết lập môi trường với một ml.g4dn.xlarge ví dụ và chọn Chọn.

Thiết lập mô hình BERT được đào tạo trước

Trong phần này, chúng tôi nhập tập dữ liệu Nhận dạng văn bản từ thư viện tập dữ liệu và chia tập dữ liệu thành các tập huấn luyện và xác thực. Tập dữ liệu này bao gồm các cặp câu. Nhiệm vụ của BERT PLM là nhận biết, cho hai đoạn văn bản, liệu ý nghĩa của một đoạn văn bản có thể được suy ra từ đoạn văn bản kia hay không. Trong ví dụ sau, chúng ta có thể suy ra nghĩa của cụm từ đầu tiên từ cụm từ thứ hai:

Phrase 1: A man with a beard, wearing a red shirt with gray sleeves and work gloves, pulling on a rope.
Phrase 2: A bearded man pulls a rope

Chúng tôi tải tập dữ liệu kế thừa nhận dạng văn bản từ KEO bộ điểm chuẩn thông qua thư viện dữ liệu từ Ôm mặt trong kịch bản đào tạo của chúng tôi (./training.py). Chúng tôi chia tập dữ liệu huấn luyện ban đầu từ GLUE thành tập huấn luyện và xác thực. Theo cách tiếp cận của chúng tôi, chúng tôi tinh chỉnh mô hình BERT cơ sở bằng cách sử dụng tập dữ liệu huấn luyện, sau đó chúng tôi thực hiện tìm kiếm đa mục tiêu để xác định tập hợp các mạng con cân bằng tối ưu giữa các số liệu mục tiêu. Chúng tôi sử dụng tập dữ liệu huấn luyện dành riêng cho việc tinh chỉnh mô hình BERT. Tuy nhiên, chúng tôi sử dụng dữ liệu xác thực cho tìm kiếm đa mục tiêu bằng cách đo lường độ chính xác trên tập dữ liệu xác thực loại trừ.

Tinh chỉnh BERT PLM bằng tập dữ liệu dành riêng cho miền

Các trường hợp sử dụng điển hình cho mô hình BERT thô bao gồm dự đoán câu tiếp theo hoặc mô hình hóa ngôn ngữ ẩn. Để sử dụng mô hình BERT cơ sở cho các tác vụ tiếp theo, chẳng hạn như yêu cầu nhận dạng văn bản, chúng tôi phải tinh chỉnh thêm mô hình bằng cách sử dụng tập dữ liệu dành riêng cho từng miền. Bạn có thể sử dụng mô hình BERT được tinh chỉnh cho các tác vụ như phân loại trình tự, trả lời câu hỏi và phân loại mã thông báo. Tuy nhiên, với mục đích của bản demo này, chúng tôi sử dụng mô hình tinh chỉnh để phân loại nhị phân. Chúng tôi tinh chỉnh mô hình BERT được đào tạo trước bằng tập dữ liệu huấn luyện mà chúng tôi đã chuẩn bị trước đó, sử dụng các siêu tham số sau:

hyperparameters["per_device_train_batch_size"] = 8
hyperparameters["per_device_eval_batch_size"] = 8
hyperparameters["learning_rate"] = 2e-05
hyperparameters["num_train_epochs"] = 5
hyperparameters["save_strategy"] = "epoch"
hyperparameters[
"is_regression"
] = False  # set this to True if your dataset is a regression dataset, for example STSB

Chúng tôi lưu điểm kiểm tra của quá trình đào tạo mô hình vào một Dịch vụ lưu trữ đơn giản của Amazon (Amazon S3) để có thể tải mô hình trong quá trình tìm kiếm đa mục tiêu dựa trên NAS. Trước khi huấn luyện mô hình, chúng tôi xác định các số liệu như kỷ nguyên, tổn thất đào tạo, số lượng tham số và lỗi xác thực:

session = Session()
s3_bucket = session.default_bucket()
s3_bucket_prefix = "nas_amt/model_checkpoint"
s3_path = f"s3://{s3_bucket}/{s3_bucket_prefix}"

metric_definitions = [
    {"Name": "epoch", "Regex": "epoch: ([0-9.]+)"},
    {"Name": "training-loss", "Regex": "training loss: ([0-9.]+)"},
    {"Name": "num-parameters", "Regex": "number of parameters: ([0-9.]+)"},
    {"Name": "validation-error", "Regex": "validation error: ([0-9.]+)"},
]

sm_args = dict(
    entry_point="training.py",
    source_dir=os.path.abspath(""),
    instance_type="ml.g4dn.xlarge",
    instance_count=1,
    py_version="py39",
    framework_version="1.13",
    transformers_version="4.26",
    max_run=3600 * 72,
    role=get_execution_role(),
    checkpoint_local_path="/opt/ml/checkpoints",
    hyperparameters=hyperparameters,
    checkpoint_s3_uri=s3_path,
    metric_definitions=metric_definitions,
)
est = PyTorch(**sm_args)
est.fit()

Sau khi quá trình tinh chỉnh bắt đầu, công việc đào tạo sẽ mất khoảng 15 phút để hoàn thành.

Thực hiện tìm kiếm đa mục tiêu để chọn mạng con và trực quan hóa kết quả

Trong bước tiếp theo, chúng tôi thực hiện tìm kiếm đa mục tiêu trên mô hình BERT cơ sở đã được tinh chỉnh bằng cách lấy mẫu các mạng con ngẫu nhiên bằng SageMaker AMT. Để truy cập mạng con trong siêu mạng (mô hình BERT tinh chỉnh), chúng tôi che giấu tất cả các thành phần PLM không thuộc mạng con. Che giấu siêu mạng để tìm các mạng con trong PLM là một kỹ thuật được sử dụng để cô lập và xác định các mẫu hành vi của mô hình. Lưu ý rằng máy biến áp Ôm Mặt cần kích thước ẩn phải là bội số của số đầu. Kích thước ẩn trong PLM biến áp kiểm soát kích thước của không gian vectơ trạng thái ẩn, điều này ảnh hưởng đến khả năng của mô hình trong việc tìm hiểu các biểu diễn và mẫu phức tạp trong dữ liệu. Trong BERT PLM, vectơ trạng thái ẩn có kích thước cố định (768). Chúng tôi không thể thay đổi kích thước ẩn và do đó số mặt ngửa phải nằm trong [1, 3, 6, 12].

Ngược lại với tối ưu hóa một mục tiêu, trong cài đặt đa mục tiêu, chúng tôi thường không có một giải pháp duy nhất tối ưu hóa đồng thời tất cả các mục tiêu. Thay vào đó, chúng tôi mong muốn thu thập một tập hợp các giải pháp vượt trội hơn tất cả các giải pháp khác trong ít nhất một mục tiêu (chẳng hạn như lỗi xác thực). Bây giờ chúng ta có thể bắt đầu tìm kiếm đa mục tiêu thông qua AMT bằng cách đặt các số liệu mà chúng ta muốn giảm (lỗi xác thực và số lượng tham số). Các mạng con ngẫu nhiên được xác định bởi tham số max_jobs và số lượng công việc đồng thời được xác định bởi tham số max_parallel_jobs. Mã để tải điểm kiểm tra mô hình và đánh giá mạng con có sẵn trong evaluate_subnetwork.py kịch bản.

# Maximum number of sub-networks we will evaluate
max_jobs = 100
max_parallel_jobs = 5

# Entry point script to load the super-network and evaluate a sub-network
entry_point = "evaluate_subnetwork.py"

# Command line arguments for the entry point script
hyperparameters = {"model_name_or_path": model_type, "output_dir": "./tmp", "task_name": "rte"}

# Define the metric we want to minimize
metric_definitions = [
    {"Name": "num-parameters", "Regex": "number of parameters: ([0-9.]+)"},
    {"Name": "validation-error", "Regex": "validation error: ([0-9.]+)"},
]

# Define HuggingFace estimator
estimator = HuggingFace(
    entry_point=entry_point,
    source_dir="./",
    instance_type="ml.g4dn.xlarge",  # instance types for the SageMaker training jobs
    instance_count=1,
    py_version="py39",
    framework_version="1.13",
    pytorch_version="1.13",
    transformers_version="4.26",
    max_run=3600 * 72,
    role=get_execution_role(),
    volume_size=125,
    model_uri=s3_path,
    hyperparameters=hyperparameters,
)

current_time = datetime.now().strftime("%m-%d-%Y-%H-%M-%S")
tuning_job_name = f"nas-search-{current_time}"

# Search space to define sub-networks
hyperparameter_ranges = {
    "num_layers": IntegerParameter(0, 12),
    # To meet HuggingFace constraints, we can only set the number of head to these values
    "num_heads": CategoricalParameter([1, 3, 6, 12]),
    "num_units": IntegerParameter(0, 3072),
}

# Define AMT Tuner object
my_tuner = HyperparameterTuner(
    estimator=estimator,
    objective_metric_name="validation-error",
    hyperparameter_ranges=hyperparameter_ranges,
    metric_definitions=metric_definitions,
    max_jobs=max_jobs,
    strategy="Random",
    random_seed=seed,
    objective_type="Minimize",
    max_parallel_jobs=max_parallel_jobs,
)

# Start hyperparameter tuning job
my_tuner.fit(job_name=tuning_job_name)

Công việc điều chỉnh AMT mất khoảng 2 giờ 20 phút để chạy. Sau khi công việc điều chỉnh AMT chạy thành công, chúng tôi phân tích lịch sử công việc và thu thập các cấu hình của mạng con, chẳng hạn như số đầu, số lớp, số đơn vị và số liệu tương ứng như lỗi xác thực và số lượng tham số. Ảnh chụp màn hình sau đây hiển thị tóm tắt về công việc điều chỉnh AMT thành công.

Tiếp theo, chúng tôi trực quan hóa kết quả bằng cách sử dụng bộ Pareto (còn được gọi là bộ biên giới Pareto hoặc bộ tối ưu Pareto), giúp chúng tôi xác định các nhóm mạng con tối ưu thống trị tất cả các mạng con khác trong số liệu mục tiêu (lỗi xác thực):

history = my_tuner.analytics().dataframe()
data = []
configs = []
for i, t in enumerate(my_tuner.analytics().training_job_summaries()):
    jn = t["TrainingJobName"]
    df = sagemaker.analytics.TrainingJobAnalytics(jn).dataframe()

    row = history[history["TrainingJobName"] == jn]
    config = {
        "num-heads": int(row["num_heads"].iloc[0].strip('"')),
        "num-layers": int(row["num_layers"]),
        "num-units": int(row["num_units"]),
    }
    configs.append(config)

    p = []
    for j, metric in enumerate(metric_definitions):
        metric_name = metric["Name"]
        if "metric_name" not in df.keys():
            continue
        y = float(df[df["metric_name"] == metric_name]["value"])
        p.append(y)
    if len(p) > 0:
        data.append(p)

data = np.array(data)

Đầu tiên, chúng tôi thu thập dữ liệu từ công việc điều chỉnh AMT. Sau đó, chúng tôi vẽ đồ thị bộ Pareto bằng cách sử dụng matplotlob.pyplot với số lượng tham số ở trục x và lỗi xác thực ở trục y. Điều này ngụ ý rằng khi chúng ta chuyển từ mạng con này của bộ Pareto sang mạng con khác, chúng ta phải hy sinh hiệu suất hoặc kích thước mô hình nhưng phải cải thiện mạng con kia. Cuối cùng, bộ Pareto cung cấp cho chúng tôi sự linh hoạt để chọn mạng con phù hợp nhất với sở thích của chúng tôi. Chúng tôi có thể quyết định mức độ chúng tôi muốn giảm quy mô mạng của mình và mức độ hiệu suất mà chúng tôi sẵn sàng hy sinh.

import matplotlib.pyplot as plt
from multi_objective import get_pareto_optimal

# get results of the un-pruned network
df = sagemaker.analytics.TrainingJobAnalytics(est.jobs[0].name).dataframe()
validation_error_unpruned_network = float(df[df["metric_name"] == "validation-error"].value.min())
params_unpruned_network = int(df[df["metric_name"] == "num-parameters"].value.min())
plt.scatter(
params_unpruned_network,
validation_error_unpruned_network,
marker="o",
s=80,
facecolors="none",
edgecolors="C3",
linewidth=2,
label="un-pruned super-network",
)
# get Pareto optimal points
idx = get_pareto_optimal(data)
x = data[idx, 0]
y = data[idx, 1]
plt.scatter(
x,
y,
marker="o",
s=80,
facecolors="none",
edgecolors="C0",
linewidth=2,
label="Pareto front (sub-networks)",
)
plt.xlabel("number of parameters")
plt.ylabel("validation error")
plt.legend()
plt.xscale("log")
plt.grid(linewidth="1", alpha=0.4, which="both")

Triển khai mô hình BERT tinh chỉnh và mô hình mạng con được tối ưu hóa cho NAS bằng SageMaker

Tiếp theo, chúng tôi triển khai mô hình lớn nhất trong bộ Pareto dẫn đến mức độ suy giảm hiệu suất nhỏ nhất tới mức Điểm cuối SageMaker. Mô hình tốt nhất là mô hình cung cấp sự cân bằng tối ưu giữa lỗi xác thực và số lượng tham số cho trường hợp sử dụng của chúng tôi.

# Let's take the largest model in the Pareto set
indicies = np.arange(len(configs))[idx]
pareto_optimal_sub_networks = [configs[i] for i in indicies]
config_to_deploy = pareto_optimal_sub_networks[-1]  

from sagemaker.huggingface.model import HuggingFaceModel

# create Hugging Face Model Class
huggingface_model = HuggingFaceModel(
    model_data=s3_path + "/model.tar.gz",
    role=get_execution_role(),
    transformers_version="4.26",
    pytorch_version="1.13",
    py_version="py39",
    entry_point="inference.py",
    source_dir="./",
    env={"SM_HPS": json.dumps(config_to_deploy)},
)

# deploy model to SageMaker Inference
predictor = huggingface_model.deploy(initial_instance_count=1, instance_type="ml.g4dn.xlarge")

So sánh mô hình

Chúng tôi đã sử dụng mô hình BERT cơ sở được đào tạo trước, tinh chỉnh mô hình đó bằng cách sử dụng tập dữ liệu dành riêng cho miền, chạy tìm kiếm NAS để xác định các mạng con chiếm ưu thế dựa trên số liệu khách quan và triển khai mô hình được cắt bớt trên điểm cuối SageMaker. Ngoài ra, chúng tôi đã sử dụng mô hình BERT cơ sở được đào tạo trước và triển khai mô hình cơ sở trên điểm cuối SageMaker thứ hai. Tiếp theo, chúng tôi chạy thử nghiệm tải sử dụng Locust trên cả hai điểm cuối suy luận và đánh giá hiệu suất về mặt thời gian phản hồi.

Đầu tiên, chúng tôi nhập các thư viện Locust và Boto3 cần thiết. Sau đó, chúng tôi xây dựng siêu dữ liệu yêu cầu và ghi lại thời gian bắt đầu dùng để kiểm tra tải. Sau đó, tải trọng được chuyển đến API gọi điểm cuối SageMaker thông qua BotoClient để mô phỏng các yêu cầu thực của người dùng. Chúng tôi sử dụng Locust để tạo ra nhiều người dùng ảo nhằm gửi yêu cầu song song và đo lường hiệu suất điểm cuối khi tải. Các thử nghiệm được chạy bằng cách tăng số lượng người dùng tương ứng cho từng điểm cuối trong số hai điểm cuối. Sau khi hoàn tất quá trình kiểm tra, Locust xuất tệp CSV thống kê yêu cầu cho từng mô hình được triển khai.

def send(self):
        request_meta = {
            "request_type": "InvokeEndpoint",
            "name": "SageMaker",
            "start_time": time.time(),
            "response_length": 0,
            "response": None,
            "context": {},
            "exception": None,
        }
        start_perf_counter = time.perf_counter()

        try:
            response = self.sagemaker_client.invoke_endpoint(
                EndpointName=self.endpoint_name,
                Body=self.payload,
                ContentType=self.content_type,
            )
            logging.info(response["Body"].read())
        except Exception as e:
            request_meta["exception"] = e

        request_meta["response_time"] = (
            time.perf_counter() - start_perf_counter
        ) * 1000

        events.request.fire(**request_meta)

Tiếp theo, chúng tôi tạo biểu đồ thời gian phản hồi từ các tệp CSV được tải xuống sau khi chạy thử nghiệm với Locust. Mục đích của việc vẽ biểu đồ thời gian phản hồi so với số lượng người dùng là để phân tích kết quả kiểm tra tải bằng cách trực quan hóa tác động của thời gian phản hồi của các điểm cuối mô hình. Trong biểu đồ sau, chúng ta có thể thấy rằng điểm cuối của mô hình được cắt bớt NAS đạt được thời gian phản hồi thấp hơn so với điểm cuối của mô hình BERT cơ sở.

Trong biểu đồ thứ hai, là phần mở rộng của biểu đồ đầu tiên, chúng tôi quan sát thấy rằng sau khoảng 70 người dùng, SageMaker bắt đầu điều tiết điểm cuối mô hình BERT cơ sở và đưa ra một ngoại lệ. Tuy nhiên, đối với điểm cuối mô hình được cắt bớt NAS, việc điều tiết xảy ra giữa 90–100 người dùng và có thời gian phản hồi thấp hơn.

Từ hai biểu đồ, chúng tôi nhận thấy rằng mô hình được cắt tỉa có thời gian phản hồi nhanh hơn và tỷ lệ tốt hơn khi so sánh với mô hình không được cắt tỉa. Khi chúng tôi mở rộng số lượng điểm cuối suy luận, như trường hợp người dùng triển khai số lượng lớn điểm cuối suy luận cho ứng dụng PLM của họ, thì lợi ích về chi phí và cải thiện hiệu suất bắt đầu trở nên khá đáng kể.

Làm sạch

Để xóa điểm cuối SageMaker cho mô hình BERT cơ sở đã tinh chỉnh và mô hình được cắt bớt NAS, hãy hoàn thành các bước sau:

  1. Trên bảng điều khiển SageMaker, chọn Sự suy luậnĐiểm cuối trong khung điều hướng.
  2. Chọn điểm cuối và xóa nó.

Ngoài ra, từ sổ ghi chép SageMaker Studio, hãy chạy các lệnh sau bằng cách cung cấp tên điểm cuối:

predictor.delete_model()
predictor.delete_endpoint()

Kết luận

Trong bài đăng này, chúng tôi đã thảo luận về cách sử dụng NAS để tinh chỉnh mô hình BERT được tinh chỉnh. Trước tiên, chúng tôi đã huấn luyện mô hình BERT cơ sở bằng cách sử dụng dữ liệu dành riêng cho miền và triển khai nó đến điểm cuối SageMaker. Chúng tôi đã thực hiện tìm kiếm đa mục tiêu trên mô hình BERT cơ sở đã được tinh chỉnh bằng SageMaker AMT cho tác vụ mục tiêu. Chúng tôi đã trực quan hóa mặt trước Pareto và chọn mô hình BERT được cắt bớt tối ưu cho NAS Pareto và triển khai mô hình này đến điểm cuối SageMaker thứ hai. Chúng tôi đã thực hiện kiểm tra tải bằng Locust để mô phỏng người dùng truy vấn cả hai điểm cuối, đồng thời đo và ghi lại thời gian phản hồi trong tệp CSV. Chúng tôi đã vẽ biểu đồ thời gian phản hồi so với số lượng người dùng cho cả hai mô hình.

Chúng tôi quan sát thấy rằng mô hình BERT được cắt bớt hoạt động tốt hơn đáng kể cả về thời gian phản hồi và ngưỡng điều chỉnh phiên bản. Chúng tôi kết luận rằng mô hình được cắt bớt NAS có khả năng phục hồi tốt hơn khi tải tăng ở điểm cuối, duy trì thời gian phản hồi thấp hơn ngay cả khi có nhiều người dùng nhấn mạnh hệ thống hơn so với mô hình BERT cơ sở. Bạn có thể áp dụng kỹ thuật NAS được mô tả trong bài đăng này cho bất kỳ mô hình ngôn ngữ lớn nào để tìm ra mô hình được rút gọn có thể thực hiện tác vụ mục tiêu với thời gian phản hồi thấp hơn đáng kể. Bạn có thể tối ưu hóa hơn nữa phương pháp này bằng cách sử dụng độ trễ làm tham số bên cạnh việc mất xác thực.

Mặc dù chúng tôi sử dụng NAS trong bài đăng này, nhưng lượng tử hóa là một cách tiếp cận phổ biến khác được sử dụng để tối ưu hóa và nén các mô hình PLM. Lượng tử hóa làm giảm độ chính xác của trọng số và kích hoạt trong mạng được đào tạo từ dấu phẩy động 32 bit đến độ rộng bit thấp hơn như số nguyên 8 bit hoặc 16 bit, dẫn đến mô hình nén tạo ra suy luận nhanh hơn. Lượng tử hóa không làm giảm số lượng tham số; thay vào đó, nó làm giảm độ chính xác của các tham số hiện có để có được mô hình nén. Việc cắt bớt NAS sẽ loại bỏ các mạng dư thừa trong PLM, điều này tạo ra một mô hình thưa thớt với ít tham số hơn. Thông thường, việc cắt bớt và lượng tử hóa NAS được sử dụng cùng nhau để nén PLM lớn nhằm duy trì độ chính xác của mô hình, giảm tổn thất xác thực đồng thời cải thiện hiệu suất và giảm kích thước mô hình. Các kỹ thuật thường được sử dụng khác để giảm kích thước của PLM bao gồm chắt lọc kiến ​​thức, ma trận thừa số hóathác chưng cất.

Phương pháp được đề xuất trong bài đăng trên blog phù hợp với các nhóm sử dụng SageMaker để đào tạo và tinh chỉnh các mô hình bằng cách sử dụng dữ liệu theo miền cụ thể và triển khai các điểm cuối để tạo ra suy luận. Nếu bạn đang tìm kiếm một dịch vụ được quản lý hoàn toàn cung cấp nhiều lựa chọn mô hình nền tảng hiệu suất cao cần thiết để xây dựng các ứng dụng AI tổng hợp, hãy cân nhắc sử dụng nền tảng Amazon. Nếu bạn đang tìm kiếm các mô hình nguồn mở, được đào tạo trước cho nhiều trường hợp sử dụng kinh doanh và muốn truy cập các mẫu giải pháp và sổ tay ví dụ, hãy cân nhắc sử dụng Khởi động Amazon SageMaker. Phiên bản được đào tạo trước của mô hình vỏ cơ sở Ôm mặt BERT mà chúng tôi sử dụng trong bài viết này cũng có sẵn từ SageMaker JumpStart.


Về các tác giả

Aparajithan Vaidyanathan là Kiến trúc sư giải pháp doanh nghiệp chính tại AWS. Ông là Kiến trúc sư đám mây với hơn 24 năm kinh nghiệm thiết kế và phát triển hệ thống phần mềm phân tán và quy mô lớn cho doanh nghiệp. Anh ấy chuyên về AI sáng tạo và Kỹ thuật dữ liệu học máy. Anh ấy là một vận động viên chạy marathon đầy tham vọng và sở thích của anh ấy bao gồm đi bộ đường dài, đạp xe và dành thời gian cho vợ và hai con trai.

Aaron Klein là Nhà khoa học ứng dụng cấp cao tại AWS đang nghiên cứu các phương pháp học máy tự động cho mạng lưới thần kinh sâu.

Jacek Golebiowski là Nhà Khoa học Ứng dụng Sr tại AWS.

tại chỗ_img

Tin tức mới nhất

tại chỗ_img