Superset环境搭建步骤-用于pytorch算子性能监测
希望监测不同硬件平台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.配置告警