Exemple #1
0
def test_default_values_with_colon_in_env():
    with patch("seldon_core.metadata.MODEL_IMAGE",
               "localhost:32000/sklearn-iris:0.1"):
        meta = validate_model_metadata({})
    assert meta == {
        "name": "localhost:32000/sklearn-iris",
        "versions": ["0.1"],
        "platform": "",
        "inputs": [],
        "outputs": [],
        "custom": {},
    }
def test_default_values_with_env():
    with patch("seldon_core.metadata.MODEL_IMAGE",
               "seldonio/sklearn-iris:0.1"):
        meta = validate_model_metadata({})
    assert meta == {
        "apiVersion": "v2",
        "name": "seldonio/sklearn-iris",
        "versions": ["0.1"],
        "platform": "",
        "inputs": [],
        "outputs": [],
    }
def test_v1_mixed_multiple_inputs():
    data = """
        name: my-model-name
        versions: [ my-model-version-01 ]
        platform: seldon
        inputs:
        - messagetype: "tensor"
          schema:
            names: [a, b, c, d]
            shape: [ 2, 2 ]
        - messagetype: jsonData
        outputs:
        - messagetype: "binData"
        custom:
          tag-key: tag-value
    """
    meta_json = validate_model_metadata(yaml.safe_load(data))
    meta_proto = json_to_seldon_model_metadata(meta_json)
    assert meta_json == {
        "name": "my-model-name",
        "versions": ["my-model-version-01"],
        "platform": "seldon",
        "inputs": [
            {
                "messagetype": "tensor",
                "schema": {"names": ["a", "b", "c", "d"], "shape": [2, 2]},
            },
            {"messagetype": "jsonData"},
        ],
        "outputs": [{"messagetype": "binData"}],
        "custom": {"tag-key": "tag-value"},
    }
    assert json.loads(json_format.MessageToJson(meta_proto)) == {
        "name": "my-model-name",
        "versions": ["my-model-version-01"],
        "platform": "seldon",
        "inputs": [
            {
                "messagetype": "tensor",
                "schema": {"names": ["a", "b", "c", "d"], "shape": [2, 2]},
            },
            {"messagetype": "jsonData"},
        ],
        "outputs": [{"messagetype": "binData"}],
        "custom": {"tag-key": "tag-value"},
    }
Exemple #4
0
def test_validate_model_metadata():
    meta = {
        "name": "my-model-name",
        "versions": ["model-version"],
        "platform": "model-platform",
        "inputs": [{
            "name": "input",
            "datatype": "BYTES",
            "shape": [1]
        }],
        "outputs": [{
            "name": "output",
            "datatype": "BYTES",
            "shape": [1]
        }],
    }
    assert meta == validate_model_metadata(meta)
def test_v1_array(messagetype):
    data = f"""
        name: my-model-name
        versions: [ my-model-version-01 ]
        platform: seldon
        inputs:
        - messagetype: {messagetype}
          schema:
            names: [a, b, c, d]
            shape: [ 2, 2 ]
        outputs:
        - messagetype: {messagetype}
          schema:
            shape: [ 1 ]
        custom:
          tag-key: tag-value
    """
    meta_json = validate_model_metadata(yaml.safe_load(data))
    meta_proto = json_to_seldon_model_metadata(meta_json)
    assert meta_json == {
        "name": "my-model-name",
        "versions": ["my-model-version-01"],
        "platform": "seldon",
        "inputs": [
            {
                "messagetype": f"{messagetype}",
                "schema": {"names": ["a", "b", "c", "d"], "shape": [2, 2]},
            }
        ],
        "outputs": [{"messagetype": f"{messagetype}", "schema": {"shape": [1]}}],
        "custom": {"tag-key": "tag-value"},
    }
    assert json.loads(json_format.MessageToJson(meta_proto)) == {
        "name": "my-model-name",
        "versions": ["my-model-version-01"],
        "platform": "seldon",
        "inputs": [
            {
                "messagetype": f"{messagetype}",
                "schema": {"names": ["a", "b", "c", "d"], "shape": [2.0, 2.0]},
            }
        ],
        "outputs": [{"messagetype": f"{messagetype}", "schema": {"shape": [1.0]}}],
        "custom": {"tag-key": "tag-value"},
    }
def test_validate_model_metadata():
    meta = {
        "name": "my-model-name",
        "versions": ["model-version"],
        "platform": "model-platform",
        "inputs": [{
            "name": "input",
            "datatype": "BYTES",
            "shape": [1]
        }],
        "outputs": [{
            "name": "output",
            "datatype": "BYTES",
            "shape": [1]
        }],
    }
    with patch("seldon_core.metadata.MODEL_IMAGE", None):
        assert {"apiVersion": "v2", **meta} == validate_model_metadata(meta)
def init_metadata(user_model: Any) -> Dict:
    """
    Call the user model to get the model init_metadata

    Parameters
    ----------
    user_model
        User defined class instance

    Returns
    -------
        Validated model metadata
    """
    # meta_user: load metadata defined in the user_model instance
    if hasattr(user_model, "init_metadata"):
        try:
            meta_user = user_model.init_metadata()
        except SeldonNotImplementedError:
            meta_user = {}
            pass
    else:
        meta_user = {}

    if not isinstance(meta_user, dict):
        logger.error("init_metadata must return dict")
        meta_user = {}

    # meta_env: load metadata from environmental variable
    try:
        meta_env = yaml.safe_load(os.environ.get("MODEL_METADATA", "{}"))
    except yaml.YAMLError as e:
        logger.error(
            f"Reading metadata from MODEL_METADATA env variable failed: {e}")
        meta_env = {}

    meta = {**meta_user, **meta_env}

    try:
        return validate_model_metadata(meta)
    except SeldonInvalidMetadataError as e:
        logger.error(f"Metadata validation error\n{e}")
        logger.error(f"Failed to validate metadata {meta}")
        return None
def test_validate_model_metadata_with_colon_in_env():
    meta = {
        "name": "my-model-name",
        "versions": ["model-version"],
        "platform": "model-platform",
        "inputs": [{
            "name": "input",
            "datatype": "BYTES",
            "shape": [1]
        }],
        "outputs": [{
            "name": "output",
            "datatype": "BYTES",
            "shape": [1]
        }],
    }
    with patch("seldon_core.metadata.MODEL_IMAGE",
               "localhost:32000/sklearn-iris:0.1"):
        assert {"apiVersion": "v2", **meta} == validate_model_metadata(meta)
Exemple #9
0
def test_validate_model_metadata_with_env():
    meta = {
        "name": "my-model-name",
        "versions": ["model-version"],
        "platform": "model-platform",
        "inputs": [{
            "name": "input",
            "datatype": "BYTES",
            "shape": [1]
        }],
        "outputs": [{
            "name": "output",
            "datatype": "BYTES",
            "shape": [1]
        }],
    }
    with patch("seldon_core.metadata.MODEL_IMAGE",
               "seldonio/sklearn-iris:0.1"):
        assert meta == validate_model_metadata(meta)
Exemple #10
0
def test_v1_only_messagetype(messagetype):
    data = f"""
        name: my-model-name
        versions: [ my-model-version-01 ]
        platform: seldon
        inputs:
        - messagetype: {messagetype}
        outputs:
        - messagetype: {messagetype}
        custom:
          tag-key: tag-value
    """
    meta_json = validate_model_metadata(yaml.safe_load(data))
    meta_proto = json_to_seldon_model_metadata(meta_json)
    assert meta_json == {
        "name": "my-model-name",
        "versions": ["my-model-version-01"],
        "platform": "seldon",
        "inputs": [{
            "messagetype": f"{messagetype}"
        }],
        "outputs": [{
            "messagetype": f"{messagetype}"
        }],
        "custom": {
            "tag-key": "tag-value"
        },
    }
    assert json.loads(json_format.MessageToJson(meta_proto)) == {
        "name": "my-model-name",
        "versions": ["my-model-version-01"],
        "platform": "seldon",
        "inputs": [{
            "messagetype": f"{messagetype}"
        }],
        "outputs": [{
            "messagetype": f"{messagetype}"
        }],
        "custom": {
            "tag-key": "tag-value"
        },
    }
def test_v1_v2_mix():
    data = """
        name: my-model-name
        versions: [ my-model-version-01 ]
        platform: seldon
        inputs:
        - datatype: BYTES
          name: input
          shape: [ 1, 4 ]
        - messagetype: jsonData
        outputs:
        - datatype: BYTES
          name: output
          shape: [ 3 ]
        custom:
          tag-key: tag-value
    """
    meta_json = validate_model_metadata(yaml.safe_load(data))
    meta_proto = json_to_seldon_model_metadata(meta_json)
    assert meta_json == {
        "name": "my-model-name",
        "versions": ["my-model-version-01"],
        "platform": "seldon",
        "inputs": [
            {"datatype": "BYTES", "name": "input", "shape": [1, 4]},
            {"messagetype": "jsonData"},
        ],
        "outputs": [{"datatype": "BYTES", "name": "output", "shape": [3]}],
        "custom": {"tag-key": "tag-value"},
    }
    assert json.loads(json_format.MessageToJson(meta_proto)) == {
        "name": "my-model-name",
        "versions": ["my-model-version-01"],
        "platform": "seldon",
        "inputs": [
            {"name": "input", "datatype": "BYTES", "shape": ["1", "4"]},
            {"messagetype": "jsonData"},
        ],
        "outputs": [{"name": "output", "datatype": "BYTES", "shape": ["3"]}],
        "custom": {"tag-key": "tag-value"},
    }
Exemple #12
0
def test_validate_model_metadata():
    meta = {
        "name": "my-model-name",
        "versions": ["model-version"],
        "platform": "model-platform",
        "inputs": [{
            "name": "input",
            "datatype": "BYTES",
            "shape": [1]
        }],
        "outputs": [{
            "name": "output",
            "datatype": "BYTES",
            "shape": [1]
        }],
        "custom": {
            "tag-key": "tag-value"
        },
    }
    with patch("seldon_core.metadata.MODEL_IMAGE", None):
        assert meta == validate_model_metadata(meta)
Exemple #13
0
def test_validate_model_metadata_wrong_versions(invalid_versions):
    with pytest.raises(SeldonInvalidMetadataError):
        validate_model_metadata({"versions": invalid_versions})
Exemple #14
0
def test_v1_json_with_schema():
    data = """
        name: my-model-name
        versions: [ my-model-version-01 ]
        platform: seldon
        inputs:
        - messagetype: jsonData
          schema:
              type: object
              properties:
                  names:
                      type: array
                      items:
                          type: string
                  data:
                    type: array
                    items:
                        type: number
                        format: double
        outputs:
        - messagetype: jsonData
    """
    meta_json = validate_model_metadata(yaml.safe_load(data))
    meta_proto = json_to_seldon_model_metadata(meta_json)
    assert meta_json == {
        "name": "my-model-name",
        "versions": ["my-model-version-01"],
        "platform": "seldon",
        "inputs": [
            {
                "messagetype": "jsonData",
                "schema": {
                    "type": "object",
                    "properties": {
                        "names": {"type": "array", "items": {"type": "string"}},
                        "data": {
                            "type": "array",
                            "items": {"type": "number", "format": "double"},
                        },
                    },
                },
            }
        ],
        "outputs": [{"messagetype": "jsonData"}],
    }
    assert json.loads(json_format.MessageToJson(meta_proto)) == {
        "name": "my-model-name",
        "versions": ["my-model-version-01"],
        "platform": "seldon",
        "inputs": [
            {
                "messagetype": "jsonData",
                "schema": {
                    "properties": {
                        "names": {"items": {"type": "string"}, "type": "array"},
                        "data": {
                            "type": "array",
                            "items": {"type": "number", "format": "double"},
                        },
                    },
                    "type": "object",
                },
            }
        ],
        "outputs": [{"messagetype": "jsonData"}],
    }