def test_passing_params_overrides_polyaxonfiles(self): run_config = CompiledOperationSpecification.read( [ os.path.abspath("tests/fixtures/typing/required_inputs.yml"), {"kind": "compiled_operation"}, ] ) with self.assertRaises(ValidationError): CompiledOperationSpecification.apply_operation_contexts(run_config) assert run_config.inputs[0].value is None assert run_config.inputs[1].value is None run_config.apply_params( params={"flag": {"value": True}, "loss": {"value": "some-loss"}} ) assert run_config.inputs[0].value == "some-loss" assert run_config.inputs[1].value is True run_config = CompiledOperationSpecification.apply_operation_contexts(run_config) run_config = CompiledOperationSpecification.apply_runtime_contexts(run_config) assert run_config.version == 1.1 assert run_config.tags == ["foo", "bar"] assert run_config.run.container.image == "my_image" assert run_config.run.container.command == ["/bin/sh", "-c"] assert ( run_config.run.container.args == "video_prediction_train --loss=some-loss --flag" )
def test_apply_params_extends_connections_and_init(self): content = { "version": 1.1, "kind": "compiled_operation", "inputs": [ { "name": "docker_image", "type": types.IMAGE }, { "name": "git_repo", "type": types.GIT }, ], "run": { "kind": V1RunKind.JOB, "connections": ["{{ params.docker_image.connection }}"], "container": { "name": "polyaxon-main", "image": "{{ docker_image }}", "command": "train", }, }, } run_config = V1CompiledOperation.read(content) # no params with self.assertRaises(ValidationError): CompiledOperationSpecification.apply_operation_contexts(run_config) params = { "docker_image": { "value": "destination:tag", "connection": "docker-registry", }, "git_repo": { "value": V1GitType(revision="foo"), "connection": "repo-connection", }, } assert run_config.inputs[0].value is None assert run_config.inputs[1].value is None validated_params = run_config.validate_params(params=params) run_config.apply_params(params=params) assert params == {p.name: p.param.to_dict() for p in validated_params} assert run_config.inputs[0].connection == "docker-registry" assert run_config.inputs[1].connection == "repo-connection" run_config = CompiledOperationSpecification.apply_operation_contexts( run_config) run_config = CompiledOperationSpecification.apply_params(run_config) run_config = CompiledOperationSpecification.apply_runtime_contexts( run_config) assert run_config.run.connections == ["docker-registry"] assert run_config.run.container.image == "destination:tag"
def test_run_simple_file_passes(self): run_config = V1CompiledOperation.read([ os.path.abspath("tests/fixtures/typing/run_cmd_simple_file.yml"), { "kind": "compiled_operation" }, ]) assert run_config.inputs[0].value == "MeanSquaredError" assert run_config.inputs[1].value is None validated_params = run_config.validate_params() assert run_config.inputs[0].value == "MeanSquaredError" assert run_config.inputs[1].value is None assert { "loss": V1Param(value="MeanSquaredError"), "num_masks": V1Param(value=None), } == {p.name: p.param for p in validated_params} with self.assertRaises(ValidationError): CompiledOperationSpecification.apply_operation_contexts(run_config) validated_params = run_config.validate_params( params={"num_masks": { "value": 100 }}) assert { "loss": V1Param(value="MeanSquaredError"), "num_masks": V1Param(value=100), } == {p.name: p.param for p in validated_params} assert run_config.run.container.args == [ "video_prediction_train", "--num_masks={{num_masks}}", "--loss={{loss}}", ] with self.assertRaises(ValidationError): # Applying context before applying params CompiledOperationSpecification.apply_operation_contexts(run_config) run_config.apply_params(params={"num_masks": {"value": 100}}) run_config = CompiledOperationSpecification.apply_operation_contexts( run_config) run_config = CompiledOperationSpecification.apply_runtime_contexts( run_config) assert run_config.version == 1.1 assert run_config.tags == ["foo", "bar"] container = run_config.run.container assert isinstance(container, k8s_schemas.V1Container) assert container.image == "my_image" assert container.command == ["/bin/sh", "-c"] assert container.args == [ "video_prediction_train", "--num_masks=100", "--loss=MeanSquaredError", ]
def test_specification_with_context_requirement(self): context_root = container_contexts.CONTEXT_ROOT contexts = { "globals": { "owner_name": "user", "project_name": "project", "project_unique_name": "user.project", "project_uuid": "uuid", "run_info": "user.project.runs.uuid", "name": "run", "uuid": "uuid", "context_path": "/plx-context", "artifacts_path": "{}/artifacts".format(context_root), "run_artifacts_path": "{}/artifacts/test".format(context_root), "run_outputs_path": "{}/artifacts/test/outputs".format(context_root), "namespace": "test", "iteration": 12, "ports": [1212, 1234], "base_url": "/services/v1/test/user/project/runs/uuid", "created_at": None, "compiled_at": None, "cloning_kind": None, "original_uuid": None, }, "init": {}, "connections": {"foo": {"key": "connection-value"}}, } run_config = CompiledOperationSpecification.read( [ os.path.abspath( "tests/fixtures/plain/polyaxonfile_with_contexts_requirements.yaml" ), {"kind": "compiled_operation"}, ] ) run_config = CompiledOperationSpecification.apply_operation_contexts(run_config) expected_run = { "kind": V1RunKind.JOB, "init": [ { "artifacts": {"files": ["{{globals.run_outputs_path}}/foo"]}, "connection": "{{connections['foo']['key']}}", } ], "container": { "image": "continuumio/miniconda3", "command": ["python"], "workingDir": "{{ globals.artifacts_path }}/repo", "args": ["-c \"print('Tweet tweet')\""], "name": "polyaxon-main", }, } assert run_config.run.to_dict() == expected_run run_config = V1CompiledOperation.read(run_config.to_dict()) run_config = CompiledOperationSpecification.apply_operation_contexts(run_config) assert run_config.run.to_dict() == expected_run expected_run = { "kind": V1RunKind.JOB, "init": [ { "artifacts": { "files": [ "{}/artifacts/test/outputs/foo".format( container_contexts.CONTEXT_ROOT ) ], }, "connection": "connection-value", } ], "container": { "image": "continuumio/miniconda3", "command": ["python"], "workingDir": "{}/artifacts/repo".format( container_contexts.CONTEXT_ROOT ), "args": ["-c \"print('Tweet tweet')\""], "name": "polyaxon-main", }, } run_config = CompiledOperationSpecification.apply_runtime_contexts( run_config, contexts=contexts ) assert run_config.run.to_dict() == expected_run
def test_build_run_pipeline(self): run_config = V1CompiledOperation.read([ os.path.abspath("tests/fixtures/pipelines/build_run_pipeline.yml"), { "kind": "compiled_operation" }, ]) run_config = CompiledOperationSpecification.apply_operation_contexts( run_config) assert len(run_config.run.operations) == 2 assert run_config.run.operations[0].name == "build" assert run_config.run.operations[1].name == "run" assert run_config.is_dag_run is True assert run_config.has_pipeline is True assert run_config.schedule is None assert len(run_config.run.components) == 2 assert run_config.run.components[0].name == "experiment-template" assert run_config.run.components[0].termination.to_dict() == { "maxRetries": 2 } assert run_config.run.components[0].run.to_dict() == { "kind": V1RunKind.JOB, "environment": { "nodeSelector": { "polyaxon": "experiments" }, "serviceAccountName": "service", "imagePullSecrets": ["secret1", "secret2"], }, "container": { "image": "{{ image }}", "command": ["python3", "main.py"], "args": "--lr={{ lr }}", "name": "polyaxon-main", "resources": { "requests": { "cpu": 1 } }, }, } assert run_config.run.components[1].name == "build-template" assert run_config.run.components[1].run.container.image == "base" assert run_config.run.operations[0].name == "build" # Create a an op spec run_config.run.set_op_component("run") assert run_config.run.operations[1].has_component_reference is True job_config = run_config.run.get_op_spec_by_index(1) assert {p: job_config.params[p].to_dict() for p in job_config.params} == { "image": { "value": "outputs.docker-image", "ref": "ops.build" }, "lr": { "value": 0.001 }, } run_config = OperationSpecification.compile_operation(job_config) run_config.apply_params({ "image": { "value": "foo" }, "lr": { "value": 0.001 } }) run_config = CompiledOperationSpecification.apply_operation_contexts( run_config) run_config = CompiledOperationSpecification.apply_runtime_contexts( run_config) assert run_config.termination.to_dict() == {"maxRetries": 2} assert run_config.run.to_dict() == { "kind": V1RunKind.JOB, "environment": { "nodeSelector": { "polyaxon": "experiments" }, "serviceAccountName": "service", "imagePullSecrets": ["secret1", "secret2"], }, "container": { "image": "foo", "command": ["python3", "main.py"], "args": "--lr=0.001", "name": "polyaxon-main", "resources": { "requests": { "cpu": 1 } }, }, }
def test_required_inputs_with_params(self): run_config = V1CompiledOperation.read( [ os.path.abspath("tests/fixtures/typing/required_inputs.yml"), {"kind": "compiled_operation"}, ] ) with self.assertRaises(ValidationError): CompiledOperationSpecification.apply_operation_contexts(run_config) assert run_config.inputs[0].value is None assert run_config.inputs[1].value is None run_config.apply_params( params={"loss": {"value": "bar"}, "flag": {"value": False}} ) assert run_config.inputs[0].value == "bar" assert run_config.inputs[1].value is False run_config = CompiledOperationSpecification.apply_operation_contexts(run_config) run_config = CompiledOperationSpecification.apply_runtime_contexts(run_config) assert run_config.version == 1.1 assert run_config.tags == ["foo", "bar"] assert run_config.run.container.image == "my_image" assert run_config.run.container.command == ["/bin/sh", "-c"] assert run_config.run.container.args == "video_prediction_train --loss=bar " run_config = V1CompiledOperation.read( [ os.path.abspath("tests/fixtures/typing/required_inputs.yml"), {"kind": "compiled_operation"}, ] ) assert run_config.inputs[0].value is None assert run_config.inputs[1].value is None run_config.apply_params( params={"loss": {"value": "bar"}, "flag": {"value": True}} ) assert run_config.inputs[0].value == "bar" assert run_config.inputs[1].value is True run_config = CompiledOperationSpecification.apply_operation_contexts(run_config) run_config = CompiledOperationSpecification.apply_runtime_contexts(run_config) assert run_config.version == 1.1 assert run_config.tags == ["foo", "bar"] assert run_config.run.container.image == "my_image" assert run_config.run.container.command == ["/bin/sh", "-c"] assert ( run_config.run.container.args == "video_prediction_train --loss=bar --flag" ) # Adding extra value raises with self.assertRaises(ValidationError): run_config.validate_params( params={ "loss": {"value": "bar"}, "flag": {"value": True}, "value": {"value": 1.1}, } ) with self.assertRaises(PolyaxonfileError): check_polyaxonfile( polyaxonfile=os.path.abspath( "tests/fixtures/typing/required_inputs.yml" ), params={"loss": {"value": "bar"}, "value": {"value": 1.1}}, is_cli=False, ) # Adding non valid params raises with self.assertRaises(ValidationError): run_config.validate_params(params={"value": {"value": 1.1}})