Superset环境搭建步骤-用于pytorch算子性能监测

发布于:2024-04-14 ⋅ 阅读:(144) ⋅ 点赞:(0)

希望监测不同硬件平台pytorch算子随软件栈更新的变化情况,出现性能回退时,邮件告警通知。本文提供了superset详细配置步骤(只需要修改SMTP配置部分,可直接运行).提供了mysql python demo用于插入算子的性能数据.

一.安装服务、准备测试数据

# 创建项目目录
mkdir superset
cd superset

# 创建superset配置文件:设置数据库为mysql,支持中文,开启报警,配置STMP
tee superset_config.py  <<-'EOF'
SECRET_KEY = 'superset'
SQLALCHEMY_DATABASE_URI = 'mysql://superset:superset@superset_mysql_db/superset'
WTF_CSRF_ENABLED = False
TALISMAN_ENABLED = False
BABEL_DEFAULT_LOCALE = "zh"
LANGUAGES = {
    "zh": {"flag": "cn", "name": "简体中文"},
    "en": {"flag": "us", "name": "English"},
}
from celery.schedules import crontab
FEATURE_FLAGS = {
    "ALERT_REPORTS": True
}
REDIS_HOST = "superset_cache"
REDIS_PORT = "6379"
class CeleryConfig:
    broker_url = f"redis://{REDIS_HOST}:{REDIS_PORT}/0"
    imports = (
        "superset.sql_lab",
        "superset.tasks.scheduler",
    )
    result_backend = f"redis://{REDIS_HOST}:{REDIS_PORT}/0"
    worker_prefetch_multiplier = 10
    task_acks_late = True
    task_annotations = {
        "sql_lab.get_sql_results": {
            "rate_limit": "100/s",
        },
    }
    beat_schedule = {
        "reports.scheduler": {
            "task": "reports.scheduler",
            "schedule": crontab(minute="*", hour="*"),
        },
        "reports.prune_log": {
            "task": "reports.prune_log",
            "schedule": crontab(minute=0, hour=0),
        },
    }
CELERY_CONFIG = CeleryConfig
SCREENSHOT_LOCATE_WAIT = 100
SCREENSHOT_LOAD_WAIT = 600
SLACK_API_TOKEN = "xoxb-"
SMTP_HOST = "smtp.126.com"
SMTP_PORT = 25
SMTP_STARTTLS = True
SMTP_SSL_SERVER_AUTH = True
SMTP_SSL = False
SMTP_USER = "youname@126.com"
SMTP_PASSWORD = "邮箱密码(126邮箱通过新增授权密码)"
SMTP_MAIL_FROM = "youname@126.com"
EMAIL_REPORTS_SUBJECT_PREFIX = "[Superset]"
WEBDRIVER_TYPE = "chrome"
WEBDRIVER_OPTION_ARGS = [
    "--force-device-scale-factor=2.0",
    "--high-dpi-support=2.0",
    "--headless",
    "--disable-gpu",
    "--disable-dev-shm-usage",
    "--no-sandbox",
    "--disable-setuid-sandbox",
    "--disable-extensions",
]
WEBDRIVER_BASEURL = "http://superset:8088"
WEBDRIVER_BASEURL_USER_FRIENDLY = "http://localhost:8088"
EOF

# superset汉化,且支持mysql
tee Dockerfile  <<-'EOF'
FROM apache/superset:3.1.0
COPY superset_config.py /app/pythonpath
USER root
RUN sed -i 's@deb.debian.org@repo.huaweicloud.com@g' /etc/apt/sources.list.d/debian.sources
RUN apt-get update && apt install wget unzip -y && \
    wget https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/google-chrome-stable_123.0.6312.122-1_amd64.deb && \
    apt-get install -y --no-install-recommends ./google-chrome-stable_123.0.6312.122-1_amd64.deb && \
    rm -f google-chrome-stable_123.0.6312.122-1_amd64.deb
RUN wget https://storage.googleapis.com/chrome-for-testing-public/123.0.6312.122/linux64/chromedriver-linux64.zip && \
    unzip chromedriver-linux64.zip -d /usr/bin && \
    ln -s /usr/bin/chromedriver-linux64/chromedriver /usr/bin/chromedriver && \
    chmod 755 /usr/bin/chromedriver && \
    rm -f chromedriver-linux64.zip
RUN pip install --no-cache gevent psycopg2 redis
RUN pip install PyMySQL pyhive &&\
    pybabel compile -d /app/superset/translations; exit 0
USER superset
EOF

# 构建superset镜像
docker build --no-cache -t superset-dev:3.1.0 .

# 创建mysql数据为目录
rm db -rf
mkdir db -p
# 创建mysql配置文件目录
rm conf -rf
mkdir conf -p

# 创建mysql配置文件
tee conf/my.cnf <<-'EOF'
[mysqld]
user=mysql
default-storage-engine=INNODB
character-set-server=utf8
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
EOF

# 创建mysql初始化脚本(修改用户登录权限,创建测试用例数据库及数据表)
tee init.sql  <<-'EOF'
use mysql;
grant all privileges on *.* to root@'%' identified by 'superset' with grant option;
grant all privileges on *.* to superset@'%' identified by 'superset' with grant option;
flush privileges;
create database superset;
use superset;
create table torch_ut_metrics
(
    id int auto_increment primary key,
    hostname varchar(64),
    ut_name varchar(64) not null,
    ut_alias varchar(64),
    sdk_version varchar(128),
    create_date datetime not null,
    device_name varchar(64) not null,
    latency DOUBLE,
    value DOUBLE
);
EOF

# 创建redis数据目录
rm redis-data -rf
mkdir -p redis-data

tee docker-compose.yml <<-'EOF'
version: '2'
services:
    redis:
        image: redis:5
        container_name: superset_cache
        hostname: superset_cache
        ports:
            - "6379:6379"
        volumes:
            - ./redis-data:/data  
    mysql:
        container_name: superset_mysql_db
        hostname: superset_mysql_db
        environment:
            MYSQL_ROOT_PASSWORD: "superset"
            MYSQL_USER: 'superset'
            MYSQL_PASS: 'superset'
        image: "mysql:5.7" 
        restart: always
        volumes:
            - "./db:/var/lib/mysql"
            - "./conf/my.cnf:/etc/my.cnf"
            - "./init.sql:/docker-entrypoint-initdb.d/init.sql"
        ports:
            - "3306:3306"
    superset:
        image: superset-dev:3.1.0
        container_name: superset
        hostname: superset
        restart: always
        ports:
            - 8080:8088
        environment:
            - TZ=Asia/Shanghai
EOF

apt install docker-compose -y
docker-compose -f docker-compose.yml up -d
sleep 5 #等待服务启动完成

# 初始化superset
docker exec -it superset superset fab create-admin \
              --username admin \
              --firstname Superset \
              --lastname Admin \
              --email admin@superset.com \
              --password admin
docker exec -it superset superset db upgrade
docker exec -it superset superset init

# 启动celery
docker exec -u root -i superset /bin/bash << "EOF"
source /etc/profile
source ~/.bashrc
nohup celery --app=superset.tasks.celery_app:app beat &
nohup celery --app=superset.tasks.celery_app:app worker --pool=prefork --max-tasks-per-child=128 -O fair -c 4 &
exit
EOF

# 插入测试数据
pip3 install PyMySQL

tee mysql_client.py <<-'EOF'
import pymysql
from datetime import datetime
import time
import numpy as np
import collections
class MysqlDB:
    def __init__(self,host,port,user,password,database,table):
        self.conn = pymysql.connect(host=host, user=user,
                                    password=password,
                                    database=database,port=port)
        self.cur = self.conn.cursor()
        self.table=table
    def __del__(self):
        self.cur.close()
        self.conn.close()
    def insert(self,items):
        keys=f"{tuple(items.keys())}".replace('\'','')
        sql_str=f'''insert into {self.table} {keys} value {tuple(items.values())};'''
        #print(sql_str)
        self.cur.execute(sql_str)
        self.conn.commit()
    def query(self,count=1000):
        sql_str = f'''select * from {self.table} limit {count}'''
        row_count = self.cur.execute(sql_str)
        count=min(row_count,count)
        reuslt = self.cur.fetchmany(count)
        records=[]
        for t in reuslt:
            idx,hostname,ut_name,ut_alias,sdk_version,create_date,device_name,latency,value=t
            create_date = datetime.strftime(create_date,'%Y-%m-%d %H:%M:%S.%f')
            records.append((idx,hostname,ut_name,ut_alias,sdk_version,create_date,device_name,latency,value))
        return records
    def clear(self):
        records=self.query()
        for record in records:
            idx,hostname,ut_name,ut_alias,sdk_version,create_date,device_name,latency,value=record
            sql_str = f'''delete from {self.table} where id = {idx};'''
            self.cur.execute(sql_str)
        self.conn.commit()
db=MysqlDB('192.168.132.206',3306,'superset','superset','superset',"torch_ut_metrics")
def gen_record(ut_name,device):
    record=collections.OrderedDict()
    record['hostname']="192.168.1.100"
    record['ut_name']=ut_name
    record['ut_alias']="torch.add"
    record['sdk_version']="3d1785ec4978"
    record['device_name']=device
    record['latency']=np.random.randint(10,20)
    record['value']=np.random.randint(1000,5000)
    record['create_date']=datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
    record['hostname']="192.168.1.100"
    return record
db.insert(gen_record("00001","3090"))
time.sleep(1)
db.insert(gen_record("00001","3060"))
for r in db.query(10):
    print(r)
#db.clear()
EOF

python3 mysql_client.py
sleep 5
python3 mysql_client.py
sleep 5
python3 mysql_client.py

# 打开浏览器
http://192.168.1.100:8080  #用户名:admin 密码: admin

# 其它命令
docker exec -it superset_mysql_db bash
docker exec -it superset bash
docker-compose -f docker-compose.yml down 

二.配置Superset的图表及报警

1.打开浏览器 http://IP:8080 用户名:admin 密码: admin

2.连接数据库

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3.创建图表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.生成sql语句,用于告警

在这里插入图片描述
在这里插入图片描述

5.配置告警

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.邮箱收到的告警通知

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到