Register
Login
Resources
Docs Blog Datasets Glossary Case Studies Tutorials & Webinars
Product
Data Engine LLMs Platform Enterprise
Pricing Explore
Connect to our Discord channel

build.py 5.1 KB

You have to be logged in to leave a comment. Sign In
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
  1. import os
  2. import json
  3. import logging
  4. import argparse
  5. from mlflow.deployments import get_deploy_client
  6. from mlflow_handler import MLflowHandler
  7. logger = logging.getLogger(__name__)
  8. def extend_config(args, model_data_location, stage_config):
  9. """
  10. Extend the stage configuration with additional parameters and tags based.
  11. """
  12. # Verify that config has parameters and tags sections
  13. if not "Parameters" in stage_config or not "StageName" in stage_config["Parameters"]:
  14. raise Exception("Configuration file must include StageName parameter")
  15. if not "Tags" in stage_config:
  16. stage_config["Tags"] = {}
  17. # Create new params and tags
  18. new_params = {
  19. "SageMakerProjectName": args.sagemaker_project_name,
  20. "ModelDataLocation": model_data_location,
  21. "ContainerImageURI": args.container_image_uri,
  22. "ModelExecutionRoleArn": args.model_execution_role,
  23. "EndpointInstanceCount": args.initial_instance_count,
  24. "EndpointInstanceType": args.instance_type,
  25. "DataCaptureUploadPath": "s3://" + args.s3_bucket + '/datacapture-' + stage_config["Parameters"]["StageName"],
  26. }
  27. new_tags = {
  28. "sagemaker:deployment-stage": stage_config["Parameters"]["StageName"],
  29. "sagemaker:project-id": args.sagemaker_project_id,
  30. "sagemaker:project-name": args.sagemaker_project_name,
  31. "ModelName": args.model_name,
  32. "ModelVersion": args.model_version,
  33. "TrackingURI": args.tracking_uri
  34. }
  35. return {
  36. "Parameters": {**stage_config["Parameters"], **new_params},
  37. "Tags": {**stage_config.get("Tags", {}), **new_tags},
  38. }
  39. if __name__ == "__main__":
  40. parser = argparse.ArgumentParser()
  41. parser.add_argument("--log-level", type=str, default=os.environ.get("LOGLEVEL", "INFO").upper())
  42. parser.add_argument("--model-execution-role", type=str, required=True)
  43. parser.add_argument("--sagemaker-project-id", type=str, required=True)
  44. parser.add_argument("--sagemaker-project-name", type=str, required=True)
  45. parser.add_argument("--s3-bucket", type=str, required=True)
  46. parser.add_argument("--import-staging-config", type=str, default="staging-config.json")
  47. parser.add_argument("--import-prod-config", type=str, default="prod-config.json")
  48. parser.add_argument("--export-staging-config", type=str, default="staging-config-export.json")
  49. parser.add_argument("--export-prod-config", type=str, default="prod-config-export.json")
  50. parser.add_argument("--tracking-uri", type=str, required=True)
  51. parser.add_argument("--model-name", type=str, required=True)
  52. parser.add_argument("--model-version", type=str, required=True)
  53. parser.add_argument("--container-image-uri", type=str, required=True)
  54. parser.add_argument("--initial-instance-count", type=str, required=True)
  55. parser.add_argument("--instance-type", type=str, required=True)
  56. parser.add_argument("--mlflow-username", type=str, required=True)
  57. parser.add_argument("--mlflow-token", type=str, required=True)
  58. args, _ = parser.parse_known_args()
  59. # Configure logging to output the line number and message
  60. log_format = "%(levelname)s: [%(filename)s:%(lineno)s] %(message)s"
  61. logging.basicConfig(format=log_format, level=args.log_level)
  62. os.environ['MLFLOW_TRACKING_USERNAME']=args.mlflow_username
  63. os.environ['MLFLOW_TRACKING_PASSWORD']=args.mlflow_token
  64. mlflow_handler = MLflowHandler(
  65. tracking_uri=args.tracking_uri,
  66. model_name=args.model_name,
  67. model_version=args.model_version
  68. )
  69. # create and upload a tar.gz to S3 from the MLflow model version.
  70. model_data_location = mlflow_handler.prepare_sagemaker_model()
  71. # Write the staging config
  72. with open(args.import_staging_config, "r") as f:
  73. staging_config = extend_config(args, model_data_location, json.load(f))
  74. logger.debug("Staging config: {}".format(json.dumps(staging_config, indent=4)))
  75. with open(args.export_staging_config, "w") as f:
  76. json.dump(staging_config, f, indent=4)
  77. # Write the prod config
  78. with open(args.import_prod_config, "r") as f:
  79. prod_config = extend_config(args, model_data_location, json.load(f))
  80. logger.debug("Prod config: {}".format(json.dumps(prod_config, indent=4)))
  81. with open(args.export_prod_config, "w") as f:
  82. json.dump(prod_config, f, indent=4)
  83. # Transition model version to Staging
  84. mlflow_handler.transition_model_version_stage('Staging')
  85. print("DEPLOYING MODEL!!!")
  86. model_uri = f'models:{args.model_name}/{args.model_version}'
  87. config = dict(
  88. execution_role_arn=args.model_execution_role,
  89. bucket_name=args.s3_bucket,
  90. image_url=args.container_image_uri,
  91. region_name="us-east-2",
  92. archive=False,
  93. instance_type="ml.m5.4xlarge",
  94. instance_count=1,
  95. synchronous=True,
  96. timeout_seconds=300
  97. )
  98. client = get_deploy_client("sagemaker")
  99. client.create_deployment(
  100. "kvasir-segmentation",
  101. model_uri="runs:/44a2f45b34b04b59a4ba580f44c1abea/model",
  102. flavor="python_function",
  103. config=config,
  104. )
  105. print("Deployment Complete!")
Tip!

Press p or to see the previous file or, n or to see the next file

Comments

Loading...