Source code for autogluon.tabular.models.automm.ft_transformer

"""Wrapper of the MultiModalPredictor."""

from __future__ import annotations

import logging
from typing import Dict

from autogluon.common.features.types import R_CATEGORY, R_FLOAT, R_INT, S_TEXT_NGRAM, S_TEXT_SPECIAL

from .automm_model import MultiModalPredictorModel

logger = logging.getLogger(__name__)


# TODO: Add unit tests
[docs] class FTTransformerModel(MultiModalPredictorModel): ag_key = "FT_TRANSFORMER" ag_name = "FTTransformer" _default_auxiliary_params_extra = dict( valid_raw_types=[R_INT, R_FLOAT, R_CATEGORY], ignored_type_group_special=[S_TEXT_NGRAM, S_TEXT_SPECIAL], ) minimum_num_gpus = 0 # allow FT_Transformer to be trained on CPU only gpu_required = False _default_ag_args_ensemble_extra = { "fold_fitting_strategy": "auto", "fold_fitting_strategy_gpu": "sequential_local", # Crashes when using GPU in parallel bagging } def _fit(self, X, num_gpus="auto", **kwargs): if not isinstance(num_gpus, str): if num_gpus == 0: logger.log( 30, f"WARNING: Training {self.name} on CPU (no GPU specified). This could take a long time. Use GPU to speed up training.", ) super()._fit(X, num_gpus=num_gpus, **kwargs) def _set_default_params(self): default_params = { "data.categorical.convert_to_text": False, "model.names": ["ft_transformer"], "model.ft_transformer.embedding_arch": ["linear"], "env.batch_size": 128, "env.per_gpu_batch_size": 128, "env.num_workers": 0, "env.num_workers_inference": 0, "optim.max_epochs": 2000, # Specify a large value to train until convergence "optim.weight_decay": 1.0e-5, "optim.lr_choice": None, "optim.lr_schedule": "polynomial_decay", "optim.warmup_steps": 0.0, "optim.patience": 20, "optim.top_k": 3, "_max_features": 300, # FIXME: This is a hack, move to AG_ARGS_FIT for v0.7 } for param, val in default_params.items(): self._set_default_param_value(param, val) @classmethod def _class_tags(cls): return {"handles_text": False}