in ezsmdeploy/__init__.py [0:0]
def deploy(self):
# print(self.__dict__)
start = datetime.datetime.now()
with yaspin(Spinners.point, color="green", text="") as sp:
try:
shutil.rmtree("src/")
except:
pass
# compress model files
self.tar_model()
sp.hide()
if self.model == ["tmpmodel"]:
sp.write(
str(datetime.datetime.now() - start)
+ " | No model was passed. Assuming you are downloading a model in the script or in the container"
)
else:
sp.write(
str(datetime.datetime.now() - start) + " | compressed model(s)"
)
sp.show()
# upload model file(s)
self.upload_model()
# Process instance type
self.process_instance_type()
sp.hide()
sp.write(
str(datetime.datetime.now() - start)
+ " | uploaded model tarball(s) ; check returned modelpath"
)
sp.show()
# if self.gpu and self.image == None:
# raise ValueError("The default container image used here is based on the multi-model server which does not support GPU instances. Please provide a docker image (ECR repository link) to proceed with model build and deployment.")
# else:
# handle requirements
if self.requirements == None:
rtext = (
str(datetime.datetime.now() - start)
+ " | no additional requirements found"
)
self.makedir_safe("src")
else:
self.handle_requirements()
rtext = (
str(datetime.datetime.now() - start) + " | added requirements file"
)
sp.hide()
sp.write(rtext)
sp.show()
# move script to src
shutil.copy(self.script, "src/transformscript.py")
sp.hide()
sp.write(str(datetime.datetime.now() - start) + " | added source file")
sp.show()
# ------ Dockerfile checks -------
if self.dockerfilepath == None and self.multimodel == True:
self.dockerfilepath = pkg_resources.resource_filename(
"ezsmdeploy", "data/Dockerfile"
)
elif self.dockerfilepath == None and self.multimodel == False:
self.dockerfilepath = pkg_resources.resource_filename(
"ezsmdeploy", "data/Dockerfile_flask"
)
# move Dockerfile to src
shutil.copy(self.dockerfilepath, "src/Dockerfile")
sp.hide()
sp.write(str(datetime.datetime.now() - start) + " | added Dockerfile")
sp.show()
# move model_handler and build scripts to src
if self.multimodel:
# Use multi model
path1 = pkg_resources.resource_filename(
"ezsmdeploy", "data/model_handler.py"
)
path2 = pkg_resources.resource_filename(
"ezsmdeploy", "data/dockerd-entrypoint.py"
)
path3 = pkg_resources.resource_filename(
"ezsmdeploy", "data/build-docker.sh"
)
shutil.copy(path1, "src/model_handler.py")
shutil.copy(path2, "src/dockerd-entrypoint.py")
shutil.copy(path3, "src/build-docker.sh")
self.ei = None
else:
# Use Flask stack
path1 = pkg_resources.resource_filename("ezsmdeploy", "data/nginx.conf")
path2 = pkg_resources.resource_filename(
"ezsmdeploy", "data/predictor.py"
)
path3 = pkg_resources.resource_filename("ezsmdeploy", "data/serve")
path4 = pkg_resources.resource_filename("ezsmdeploy", "data/train")
path5 = pkg_resources.resource_filename("ezsmdeploy", "data/wsgi.py")
path6 = pkg_resources.resource_filename(
"ezsmdeploy", "data/build-docker.sh"
)
shutil.copy(path1, "src/nginx.conf")
shutil.copy(path2, "src/predictor.py")
shutil.copy(path3, "src/serve")
shutil.copy(path4, "src/train")
shutil.copy(path5, "src/wsgi.py")
shutil.copy(path6, "src/build-docker.sh")
if self.gpu and self.ei != None:
self.ei = None
sp.hide()
sp.write(
str(datetime.datetime.now() - start)
+ " | Setting Elastic Inference \
to None since you selected a GPU instance"
)
sp.show()
sp.hide()
sp.write(
str(datetime.datetime.now() - start)
+ " | added model_handler and docker utils"
)
sp.show()
# build docker container
if self.image == None:
sp.write(
str(datetime.datetime.now() - start)
+ " | building docker container"
)
self.build_docker()
sp.hide()
sp.write(
str(datetime.datetime.now() - start) + " | built docker container"
)
sp.show()
# create sagemaker model
self.create_model()
sp.hide()
sp.write(
str(datetime.datetime.now() - start)
+ " | created model(s). Now deploying on "
+ self.instance_type
)
sp.show()
# deploy model
self.deploy_model()
sp.hide()
sp.write(str(datetime.datetime.now() - start) + " | deployed model")
sp.show()
if self.autoscale and self.instance_type not in ["local", "local_gpu"]:
self.autoscale_endpoint()
sp.hide()
sp.write(str(datetime.datetime.now() - start) + " | set up autoscaling")
sp.show()
elif self.autoscale and self.instance_type in ["local", "local_gpu"]:
sp.hide()
sp.write(
str(datetime.datetime.now() - start)
+ " | not setting up autoscaling; deploying locally"
)
sp.show()
if self.instance_type not in ["local", "local_gpu"]:
sp.hide()
sp.write(
str(datetime.datetime.now() - start)
+ " | estimated cost is $"
+ str(self.costperhour)
+ " per hour"
)
sp.show()
if self.monitor:
sp.hide()
sp.write(
str(datetime.datetime.now() - start)
+ " | model monitor data capture location is "
+ "s3://{}/ezsmdeploy/model-{}/datacapture".format(
self.bucket, self.name
)
)
sp.show()
# finalize
sp.green.ok(str(datetime.datetime.now() - start) + " | " "Done! ✔")
self.deployed = True
try:
# Cleanup
os.remove("src/done.txt")
os.remove("src")
os.remove("downloads")
os.remove("extractedmodel")
os.remove("tmpmodel")
except:
pass
return self.predictor