[ad_1]
Thỉnh thoảng, tất cả chúng ta đều thấy mình cân nhắc xem có nên thử công cụ mới hay thử nghiệm với một gói phần mềm nào đó không, và điều đó có một số rủi ro. Nếu công cụ không thực hiện được những gì tôi cần, hoặc mất nhiều ngày để chạy, hoặc yêu cầu kiến thức phức tạp mà tôi không có thì sao? Hôm nay, tôi sẽ chia sẻ một bài đánh giá đơn giản về trải nghiệm của riêng tôi khi đưa một mô hình vào hoạt động bằng PyTorch Tabular, với các ví dụ mã sẽ giúp những người dùng khác cân nhắc sử dụng nó để bắt đầu nhanh chóng với ít rắc rối nhất.
Dự án này bắt đầu với một mô hình CatBoost có chiều khá cao, một trường hợp sử dụng học có giám sát với kết quả phân loại đa lớp. Bộ dữ liệu có khoảng 30 lớp mất cân bằng cao, tôi sẽ mô tả chi tiết hơn trong một bài đăng trong tương lai. Tôi muốn thử áp dụng mạng nơ-ron cho cùng một trường hợp sử dụng, để xem hiệu suất có thể thay đổi như thế nào và tôi đã tìm thấy PyTorch Tabular là một lựa chọn tốt. Tất nhiên, có những giải pháp thay thế khác để áp dụng NN vào dữ liệu dạng bảng, bao gồm cả việc tự sử dụng PyTorch cơ sở, nhưng việc có một lớp ở trên được thiết kế để phù hợp với trường hợp vấn đề cụ thể của bạn thường giúp mọi thứ dễ dàng và nhanh hơn cho quá trình phát triển. PyTorch Tabular giúp bạn không phải suy nghĩ về những thứ như cách chuyển đổi khung dữ liệu của mình thành tenxơ và cung cấp cho bạn điểm truy cập trực tiếp để tùy chỉnh mô hình.
Tài liệu tại https://pytorch-tabular.readthedocs.io/en/latest/ khá dễ đọc và dễ hiểu, mặc dù trang chính sẽ hướng bạn đến phiên bản phát triển của tài liệu, vì vậy hãy ghi nhớ điều này nếu bạn đã cài đặt từ pypi.
Tôi sử dụng thơ để quản lý môi trường làm việc và thư viện của mình, và thơ và PyTorch được biết là không phải lúc nào cũng hòa hợp tốt, vì vậy đó cũng là một cân nhắc. Chắc chắn là tôi mất vài giờ để cài đặt mọi thứ và hoạt động trơn tru, nhưng đó không phải là lỗi của các nhà phát triển PyTorch Tabular.
Như bạn có thể đoán, tất cả đều được tối ưu hóa cho dữ liệu dạng bảng, vì vậy tôi đang đưa tập dữ liệu tính năng được thiết kế của mình ở định dạng pandas. Như bạn sẽ thấy sau này, tôi có thể chỉ cần đổ khung dữ liệu trực tiếp vào hàm đào tạo mà không cần định dạng lại, miễn là các trường của tôi đều là số hoặc boolean.
Khi bạn bắt đầu xây dựng cấu trúc mã của mình, bạn sẽ tạo ra một số đối tượng mà hàm đào tạo PyTorch Tabular yêu cầu:
- Cấu hình dữ liệu: chuẩn bị trình tải dữ liệu, bao gồm thiết lập tính music music để tải.
- Cấu hình huấn luyện viên: thiết lập kích thước lô và số kỷ nguyên, đồng thời cho phép bạn xác định bộ xử lý nào sẽ sử dụng, ví dụ như nếu bạn muốn/không muốn sử dụng GPU.
- Tối ưu hóa cấu hình: Cho phép bạn thêm bất kỳ trình tối ưu hóa nào bạn muốn, cũng như trình lập lịch tốc độ học tập và các chỉ định tham số cho từng trình. Tôi đã không tùy chỉnh điều này cho trường hợp sử dụng của mình, nó mặc định là
Adam
. - Cấu hình LinearHead: cho phép bạn tạo đầu mô hình nếu bạn muốn tùy chỉnh, tôi không cần thêm bất cứ điều gì đặc biệt ở đây.
- Sau đó, bạn cũng sẽ tạo một cấu hình mô hình, nhưng lớp cơ sở sẽ khác nhau tùy thuộc vào loại mô hình bạn định tạo. Tôi đã sử dụng CategoryEmbeddingModelConfig cơ bản cho mô hình của mình và đây là nơi bạn sẽ chỉ định tất cả các mục kiến trúc mô hình như kích thước và thứ tự lớp, hàm kích hoạt, tốc độ học và số liệu.
data_config = DataConfig(
goal=(target_col),
continuous_cols=options,
num_workers=0,
)
trainer_config = TrainerConfig(
batch_size=1024,
max_epochs=20,
accelerator="gpu")optimizer_config = OptimizerConfig()
head_config = LinearHeadConfig(
layers="", # No extra layer in head, only a mapping layer to output_dim
dropout=0.0,
initialization="kaiming",
).__dict__ # mannequin config requires dict
model_config = CategoryEmbeddingModelConfig(
job="classification",
layers="1024-512-512",
activation="LeakyReLU",
head="LinearHead",
head_config=head_config,
learning_rate=1e-3,
(METRICS ARGUMENTS COME NEXT)
Việc chỉ định số liệu trong phần này hơi khó hiểu, vì vậy tôi sẽ dừng lại và giải thích ngắn gọn. Tôi muốn một số số liệu khác nhau có thể nhìn thấy trong quá trình đào tạo và trong khuôn khổ này, điều đó đòi hỏi phải truyền một số danh sách cho các đối số khác nhau.
metrics=("f1_score", "average_precision", "accuracy", "auroc"),
metrics_params=(
{"job": "multiclass", "num_classes": num_classes},
{"job": "multiclass", "num_classes": num_classes},
{},
{},
), # f1_score and avg prec want num_classes and job identifier
metrics_prob_input=(
True,
True,
False,
True,
), # f1_score, avg prec, auroc want chance scores, whereas accuracy would not
Ở đây bạn có thể thấy rằng tôi đang trả về bốn số liệu, và mỗi số liệu có các yêu cầu triển khai khác nhau, vì vậy mỗi danh sách biểu diễn bốn số liệu giống nhau và các thuộc tính của chúng. Ví dụ, độ chính xác trung bình cần các tham số chỉ ra rằng đây là một vấn đề đa lớp và cần được cung cấp số lượng lớp liên quan. Nó cũng yêu cầu kết quả xác suất thay vì đầu ra mô hình thô, không giống như độ chính xác.
Khi bạn đã xác định được tất cả những điều này, mọi việc trở nên khá dễ dàng – bạn chỉ cần truyền từng đối tượng vào mô-đun TabularModel.
tabular_model = TabularModel(
data_config=data_config,
model_config=model_config,
optimizer_config=optimizer_config,
trainer_config=trainer_config,
verbose=True,
)
Và bạn đã sẵn sàng để tập luyện!
Việc thiết lập đào tạo khá dễ dàng sau khi bạn đã tạo xong các tập đào tạo, thử nghiệm và xác thực.
tabular_model.match(practice=train_split_df, validation=val_split_df)
outcome = tabular_model.consider(test_split_df)
Đào tạo với tính năng verbosity sẽ hiển thị cho bạn một thanh tiến trình đẹp mắt và thông báo cho bạn biết bạn đang ở lô và kỷ nguyên nào. Nó có thể cho bạn biết, nếu bạn không sử dụng tính music music trong trình tải dữ liệu của mình, rằng có một nút thắt cổ chai khi tải dữ liệu mà bạn có thể cải thiện bằng cách thêm nhiều công nhân hơn — tùy thuộc vào bạn xem điều này có đáng quan tâm hay không, nhưng vì công việc suy luận của tôi sẽ có một môi trường rất thưa thớt nên tôi đã chọn không có tính music music trong trình tải dữ liệu của mình.
Sau khi quá trình đào tạo hoàn tất, bạn có thể lưu mô hình theo hai cách khác nhau — một là dưới dạng đầu ra PyTorch Tabular, do đó có thể sử dụng để tải để tinh chỉnh hoặc sử dụng để suy luận trong môi trường có PyTorch Tabular. Cách còn lại là dưới dạng phiên bản chỉ suy luận, chẳng hạn như mô hình PyTorch cơ sở, mà tôi thấy rất có giá trị vì tôi cần sử dụng đối tượng mô hình trong môi trường đơn giản hơn nhiều để sản xuất.
tabular_model.save_model(
f"knowledge/fashions/tabular_version_{model_name}"
) # The PyTorch Tabular modeltabular_model.save_model_for_inference(
f"knowledge/fashions/{model_name}", sort="pytorch"
) # The bottom PyTorch model
Có một số tùy chọn khác có sẵn cho save_model_for_inference
phương pháp mà bạn có thể đọc trong tài liệu. Lưu ý thêm rằng đối tượng mô hình PyTorch Tabular không thể được chuyển từ CPU sang GPU hoặc ngược lại khi tải – bạn sẽ phải duy trì cùng một phép tính mà bạn đã sử dụng để đào tạo, trừ khi bạn lưu mô hình của mình dưới dạng đối tượng mô hình PyTorch.
Tải lại mô hình cho các quy trình suy luận sau này, tôi thấy thực sự cần phải lưu cả hai đối tượng này, tuy nhiên, vì mô hình PyTorch Tabular xuất ra một tệp có tên là datamodule.sav
điều này là cần thiết để định dạng nhất quán dữ liệu suy luận của bạn trước khi chuyển sang mô hình. Có lẽ bạn có thể tự tạo một đường ống để đưa vào mô hình, nhưng tôi thấy rằng đó là một viễn cảnh tẻ nhạt hơn nhiều so với việc chỉ sử dụng tệp theo hướng dẫn của tài liệu. (Lưu ý, tệp này có thể khá lớn – tệp của tôi có dung lượng hơn 100mb và tôi đã chọn lưu trữ riêng thay vì chỉ đặt nó cùng với phần còn lại của mã để triển khai.)
Trong PyTorch Tabular có các trình trợ giúp tích hợp để suy luận, nhưng tôi thấy rằng việc đưa ra các dự đoán đa lớp của mình với các nhãn thích hợp và ở định dạng hữu ích sạch sẽ đòi hỏi phải rút một số mã trợ giúp và viết lại trong cơ sở mã của riêng tôi. Đối với các ứng dụng không phải đa lớp, điều này có thể không cần thiết, nhưng nếu bạn thực sự đi theo cách đó, đây là kịch bản tôi đã chuyển thể từ.
Sau đây là cách quá trình suy luận trông như thế nào trong mã, với kỹ thuật tính năng, v.v. bị bỏ qua. (Quá trình này chạy trong Docker trên AWS Lambda.)
model_obj = torch.load("classifier_pytorch")
datamodule = joblib.load("datamodule.sav")...
inference_dataloader = datamodule.prepare_inference_dataloader(
self.processed_event(pytorch_feature_list), batch_size=256
)
job = "classification"
point_predictions = ()
for batch in tqdm(inference_dataloader, desc="Producing Predictions..."):
for ok, v in batch.objects():
print("New Batch")
if isinstance(v, record) and (len(v) == 0):
proceed
batch(ok) = v.to(pytorch_model.gadget)
y_hat, ret_value = pytorch_model.predict(batch, ret_model_output=True)
point_predictions.append(y_hat.detach().cpu())
Sau thời điểm này, các dự đoán được định dạng và áp dụng softmax để có được xác suất của các lớp khác nhau và tôi có thể tùy chọn gắn lại các dự đoán vào tập dữ liệu gốc để đánh giá sau.
Nhìn chung, tôi thực sự hài lòng với cách PyTorch Tabular hoạt động cho trường hợp sử dụng của mình, mặc dù tôi không chắc liệu mình có triển khai mô hình này vào sản xuất hay không. Thách thức lớn nhất của tôi là đảm bảo rằng quy trình đào tạo của tôi được thiết kế đúng cách để tác vụ suy luận (chủ yếu là trình tải dữ liệu) hoạt động hiệu quả trong môi trường sản xuất của tôi, nhưng sau khi tôi giải quyết được vấn đề thì mọi thứ đều ổn. Thành thật mà nói, việc không phải suy nghĩ nhiều về việc định dạng tenxơ cũng đáng thời gian!
Vì vậy, nếu bạn muốn thử áp dụng một mô hình từ các khuôn khổ cổ điển như CatBoost hoặc LightGBM, tôi khuyên bạn nên dùng thử PyTorch Tabular—nếu không có gì khác, nó sẽ khởi động và chạy khá nhanh, do đó, quá trình thử nghiệm của bạn sẽ không quá tẻ nhạt. Lần tới, tôi sẽ viết về chính xác mục đích sử dụng PyTorch Tabular của mình và mô tả các số liệu hiệu suất cho cùng một vấn đề cơ bản khi so sánh CatBoost với PyTorch.
[ad_2]
Source link