From c8b6841a0f71337b5f7dc091667e2703b09325ae Mon Sep 17 00:00:00 2001 From: Drew Yang Date: Wed, 27 Mar 2024 17:57:42 -0500 Subject: [PATCH] =?UTF-8?q?fix:=20=F0=9F=90=9B=20fix=20grammar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- more.html | 12 ++++++------ raw-resume.html | 10 +++++----- resume/drewyang_resume.pdf | Bin 95194 -> 95195 bytes 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/more.html b/more.html index 7540798..83c9503 100644 --- a/more.html +++ b/more.html @@ -171,25 +171,25 @@

Software Engineer(MLOps) - dataVediK

Company's commercialized product [DrillVedik]
- * Interactive Drilling Dashboard: This is an enterprise product that I worked with two more engineers. Developed a Plotly Dash dashboard that visualizes processed data using Bootstrap, CSS media query, Redis and sqlalchemy. Also, implemented a socket service will notify when Airflow pipeline finished processing in order to synchronize(refresh) the dashboard's data. + * Interactive Drilling Dashboard: Developed an enterprise Plotly Dash dashboard in collaboration with two more engineers that visualizes processed data using Bootstrap, CSS media query, Redis and sqlalchemy. Also, implemented a socket service that will notify when Airflow pipeline is finished processing in order to synchronize(refresh) the dashboard's data.
* CI/CD Pipeline: Set up several Azure Pipelines for continuous development, testing and continuous deployment in dev, test and prod stages. Additionally, made a Jenkins pipeline to work with on-premise infrastructures.
- * ML Pipeline: Set up a MLflow server for machine learning experiment logging, parameter tuning, continuous training, model management and model serving. + * ML Pipeline: Hosted a MLflow server for machine learning experiment logging, parameter tuning, continuous training, model management and model serving.
- * ETL Pipeline: Working with a data engineer, set up an Airflow server for our data ETL pipeline. + * ETL Pipeline: Deployed an Airflow server in collaboration with another data engineer, for our data ETL pipeline.
- * Prediction Task Manager: Working with a front-end developer, designed and developed a production web application that supports job queuing and parallel processing for drilling speed prediction using JavaScript, flask, sqlalchemy, celery, RabbitMQ, gunicorn, Nginx, supervisord, Docker and AWS EC2, AWS Cognito Authentication, HTTPS + * Prediction Task Manager: Designed and developed a production web application in collaboration with a front-end developer that supports job queuing and parallel processing for drilling speed prediction using JavaScript, flask, sqlalchemy, celery, RabbitMQ, gunicorn, Nginx, supervisord, Docker and AWS EC2, AWS Cognito Authentication, HTTPS
- * Drilling Status Detection: Working with a domain expert, developed two classification models for detecting drilling status using Logistic Regression and Random Forest with the convenience of the MLflow server + * Drilling Status Detection: Developed two classification models in collaboration with a domain expert for detecting drilling status using Logistic Regression and Random Forest with the convenience of the MLflow server
- * Drilling Speed Prediction: Working with a domain expert, applied Gaussian Process Regression for feature synthesis based on geographical information as well as feature engineering based on correlation matrix and F1 score ranking, built a non-linear regression model using LSTM RNN. + * Drilling Speed Prediction: In collaboration with a domain expert, applied Gaussian Process Regression for feature synthesis based on geographical information as well as feature engineering based on correlation matrix and F1 score ranking, and built a non-linear regression model using LSTM RNN.
diff --git a/raw-resume.html b/raw-resume.html index abe0575..5a0f993 100644 --- a/raw-resume.html +++ b/raw-resume.html @@ -46,7 +46,7 @@
Experience
- * AWS: Administrated the company's AWS account and several other customers' AWS accounts. Configured VPC, Subnet, Security Groups, IAM role and policies, S3 lifecycle management, EFS access point, EC2 instances, RDS instances, Lambda triggered by SQS or EventBridge, SNS and SES, CloudWatch metrics and alarms, Route 53 DNS records, Secrets Manager for deployment secrets. + * AWS: Administrated DataJoint's AWS account and several other customers' AWS accounts. Configured VPC, Subnet, Security Groups, IAM role and policies, S3 lifecycle management, EFS access point, EC2 instances, RDS instances, Lambda triggered by SQS or EventBridge, SNS and SES, CloudWatch metrics and alarms, Route 53 DNS records, Secrets Manager for deployment secrets.
* CI/CD: Developed generic Github Actions reusable workflows used by 30+ repositories followed by Conventional Commits, Release Flow and GitOps best practices, to automate build, test, release, publish private or open-source Python packages[PyPI] or deploy Docker images[Dockerhub]. @@ -55,7 +55,7 @@
Experience
* Kubernetes: Provisioned Kubernetes clusters for development, staging and production environments using k3d or kOps. Developed utility bash scripts with helm and kubectl to manage Kubernetes clusters more efficiently, including configuring Nginx ingress controller, cert manager with Let's encrypt issuer, Cillium Container Network Interface(CNI), IAM Roles for Service Account(IRSA), Cluster Autoscaler, AWS Elastic Load Balancer(ELB) or deploying applications like Percona XtraDB Clusters, Keycloak, JupyterHub, Flask and ReactJS based web application, etc.
- * Ephemeral Worker Clusters: Designed and developed a worker lifecycle manager using Python in about a month to fulfill an urgent business requirement. This development polls jobs from a MySQL database, then provisions and configures ephemeral EC2 instances by Packer(pre-build AMI), Terraform and cloud-init to compute jobs at scale; implemented AWS S3 mount to significantly reduce raw data downloading overhead and added EFS as a file cache for intermediate steps to improve computation failover; configured NVIDIA CUDA toolkit and NVIDIA container runtime for GPU workers. + * Ephemeral Worker Clusters: Designed and developed a worker lifecycle manager using Python within one month to fulfill an urgent business requirement. This development polls jobs from a MySQL database, then provisions and configures ephemeral EC2 instances by Packer(pre-build AMI), Terraform and cloud-init to compute jobs at scale; implemented AWS S3 mount to significantly reduce raw data downloading overhead and added EFS as a file cache for intermediate steps to improve computation failover; configured NVIDIA CUDA toolkit and NVIDIA container runtime for GPU workers.
* Platform Automation: To provision or terminate AWS resources using boto3 or Terraform; manage customers' RBAC permissions using Keycloak and Github REST API; generating usage and billing report with AWS S3 Inventory report, AWS CloudTrail and AWS Cost and Usage report, made a Plotly Dash to analyze cost and usage efficiency. @@ -64,13 +64,13 @@
Experience
* Jupyterhub: Configured and maintained Jupyterhub deployment on a Kubernetes cluster with Node Affinity to assign pods onto different nodes by requirements and Cluster Autoscaler along with AWS Auto Scaling Group to accommodate 100+ active users; improved base images' build time and maintenance overhead.
- * Observability: Implemented small part of the metrics and alerts using AWS CloudWatch, and then later integrated Datadog for Kubernetes clusters' and ephemeral EC2 instances' metrics and logging through OpenTelemetry protocol, synthetic API testing, UI/UX monitoring. + * Observability: Implemented a small part of the metrics and alerts using AWS CloudWatch, and then later integrated Datadog for Kubernetes clusters' and ephemeral EC2 instances' metrics and logging through OpenTelemetry protocol, synthetic API testing, and UI/UX monitoring.
- * Security: Set up codebase vulnerability scan with FOSSA; Set up AWS Secrets Manager working with External Secret Store Operator to secure Kubernetes secrets; Deployed and administrated self-hosted Keycloak for RABC authentication, further integrate it with AWS IAM as an identity provider to access AWS resources through STS, learned about OpenID Connect(OIDC) authentication flow such as authorization code flow, client credential flow, password grant flow etc. + * Security: Set up codebase vulnerability scan with FOSSA; Set up AWS Secrets Manager working with External Secret Store Operator to secure Kubernetes secrets; Deployed and administrated self-hosted Keycloak for RABC authentication, further integrated it with AWS IAM as an identity provider to access AWS resources through STS, enabled OpenID Connect(OIDC) authentication flows such as authorization code flow, client credential flow, password grant flow etc.
- * MySQL Database: Maintained a self-hosted Percona XtraDB Clusters on database daily backup stored on S3, mysqldump backup redundancy, Point-in-Time Recovery(PITR), deadlock detection, slow query log. + * MySQL Database: Maintained a self-hosted Percona XtraDB Clusters on database daily backup stored on S3, mysqldump backup redundancy, Point-in-Time Recovery(PITR), deadlock detection, and slow query log.
diff --git a/resume/drewyang_resume.pdf b/resume/drewyang_resume.pdf index fb8b339e2e7eaaf9b161ec1c7cf6f4f25044e3e8..e82eb5120de34b091dede1bfe8dfb90cfb0ff5e0 100644 GIT binary patch delta 5871 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

azyB%FI@o#E}z+qQ{j7h?=fw{Do) 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 HmB9Z6{chyj