-
Notifications
You must be signed in to change notification settings - Fork 4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Support optional inputs in model signatures #8438
Conversation
Documentation preview for 96030fb will be available here when this CircleCI job completes successfully. More info
|
Could you update PR description to attach an example code that shows the case your PR supports ? |
@WeichenXu123 PR not ready yet. I'll have all that in when requesting review |
if input_schema and len(input_schema.optional_input_names()) > 0: | ||
raise MlflowException( | ||
message="Cannot apply UDF without column names specified when" | ||
" model signature contains optional columns.", | ||
error_code=INVALID_PARAMETER_VALUE, | ||
) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Automatic parameter filling relies on the model signature to determine what the columns will be when the UDF is applied to the dataframe.
With optional columns, we can neither:
- include one or all of them, as that would implicitly require those columns to exist in the dataframe, raising an error within pyspark
- exclude one or all of them, as they would then not be selected from the dataframe at all
Given this, it seems reasonable to prevent this convenience for this case. Users can still manually pass in the list of columns to udf
as follows:
test_signature = {
"inputs": '[{"name": "a", "type": "long"}, {"name": "b", "type": "long"}, {"name" : "c", "type": "long", "optional": "True"}]',
}
signature = ModelSignature.from_dict(test_signature)
...
udf = mlflow.pyfunc.spark_udf(...)
data = spark.createDataFrame(
pd.DataFrame(columns=["a", "b"], data={"a": [1, 2], "b": [2, 3]})
)
res = data.withColumn("response", udf(*data.columns)) # <-- calling udf() would throw an exception.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Make sense!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
Related Issues/PRs
#xxxWhat changes are proposed in this pull request?
Add an
optional
boolean parameter toColSpec
to specify whether the column in question is required for model inference or can be omitted. Updates code accordingly:optional
toFalse
for backwards compatibility.Example usage (pyfunc):
Example (spark udf):
How is this patch tested?
Does this PR change the documentation?
Release Notes
Optional input columns can now be specified in model signatures. These columns can be omitted from input dataframes at prediction time.
Is this a user-facing change?
Optional input columns can now be specified in model signatures. These columns can be omitted from input dataframes at prediction time.
What component(s), interfaces, languages, and integrations does this PR affect?
Components
area/artifacts
: Artifact stores and artifact loggingarea/build
: Build and test infrastructure for MLflowarea/docs
: MLflow documentation pagesarea/examples
: Example codearea/model-registry
: Model Registry service, APIs, and the fluent client calls for Model Registryarea/models
: MLmodel format, model serialization/deserialization, flavorsarea/recipes
: Recipes, Recipe APIs, Recipe configs, Recipe Templatesarea/projects
: MLproject format, project running backendsarea/scoring
: MLflow Model server, model deployment tools, Spark UDFsarea/server-infra
: MLflow Tracking server backendarea/tracking
: Tracking Service, tracking client APIs, autologgingInterface
area/uiux
: Front-end, user experience, plotting, JavaScript, JavaScript dev serverarea/docker
: Docker use across MLflow's components, such as MLflow Projects and MLflow Modelsarea/sqlalchemy
: Use of SQLAlchemy in the Tracking Service or Model Registryarea/windows
: Windows supportLanguage
language/r
: R APIs and clientslanguage/java
: Java APIs and clientslanguage/new
: Proposals for new client languagesIntegrations
integrations/azure
: Azure and Azure ML integrationsintegrations/sagemaker
: SageMaker integrationsintegrations/databricks
: Databricks integrationsHow should the PR be classified in the release notes? Choose one:
rn/breaking-change
- The PR will be mentioned in the "Breaking Changes" sectionrn/none
- No description will be included. The PR will be mentioned only by the PR number in the "Small Bugfixes and Documentation Updates" sectionrn/feature
- A new user-facing feature worth mentioning in the release notesrn/bug-fix
- A user-facing bug fix worth mentioning in the release notesrn/documentation
- A user-facing documentation change worth mentioning in the release notes