You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

README.md 18 kB

4 years ago
4 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629
  1. ## 依赖
  2. - 依赖 Python3.7 环境,建议使用 Anaconda 创建虚拟环境
  3. ```shell
  4. # 首次使用,执行
  5. bash init.sh
  6. # 创建虚拟环境完毕后,后续启动服务,请执行
  7. source start_server.sh
  8. # 关闭服务,请执行
  9. source stop_server.sh
  10. ```
  11. - 依赖 [Redis](https://redis.io/download) 作为中间件
  12. ## 启动
  13. 启动及部署过程参看文档:[部署可视化服务](http://tianshu.org.cn/?/course/1.html)
  14. ## 初始请求
  15. 在用户初始请求时,先请求等待页面`api/init?id=test&trainJobName=test`其中参数`id`与参数`trainJobName`必须指定。这里请求的是用户为test,train为test的日志。
  16. 待后端载入完成指定用后的日志后,若成功则返回:
  17. ```json
  18. {"code": 200, "msg": "ok", "data": {"msg": "success", "session_id": "avzppbc6e2jo3t5bbhpokh96gp1vrgju"}}
  19. ```
  20. # **以下数据格式仅供参考,以实际返回为准**
  21. ## 类目信息
  22. 在初始化完成后,需请求类目信息。
  23. 请求api`api/getCategory`返回所有类目的标签,若日志中不存在某一类目信息,则返回空数组。
  24. 其中图`graph`tag信息,固定为`s_graph`与`c_graph`;超参数没有tag,若日志中含有超参数则返回tag为`true`
  25. 格式如下:
  26. 返回数据格式如下:
  27. ```python
  28. {
  29. .: {
  30. scalar: {},
  31. media: {image: [], audio: [], text: []},
  32. statistic: {histogram: []},
  33. graph: [],
  34. ...
  35. }
  36. train: {
  37. scalar: {epoch_loss: ["epoch_loss"], epoch_accuracy: ["epoch_accuracy"]}
  38. media: {image: [],…}
  39. statistic: {histogram: []}
  40. graph: ["c_graph"]
  41. embedding: ["layer1/weights/Variable:0", "layer1/biases/Variable:0", …]
  42. hparams: ["true"]
  43. custom: ["true"]
  44. }
  45. vgg: {
  46. scalar: {,…}
  47. media: {,…}
  48. statistic: {,…}
  49. graph: ["s_graph"]
  50. embedding: []
  51. hparams: []
  52. custom: ["true"]
  53. }
  54. }
  55. ```
  56. ## Scalar
  57. 根据tag,请求api:`api/scalar?run=.&tag=layer1/weights/summaries/mean`得到tag为`layer1/weights/summaries/mean`的数据
  58. 其中`run`与`tag`缺一不可
  59. 返回数据格式
  60. ```json
  61. {
  62. "layer1/weights/summaries/mean":
  63. [
  64. {"wall_time": 1587176310.3070214, "step": 0, "value": -6.488610961241648e-05},
  65. ...,
  66. {"wall_time": 1587176425.348953, "step": 190, "value": -0.002039810409769416}
  67. ]
  68. }
  69. ```
  70. 随后随着数据量的增大,可能直接返回数组形式
  71. ```json
  72. [
  73. [1587176310.3070214, 0, 0.12780000269412994],
  74. ...
  75. [1587176425.348953, 190, 0.9401999711990356]
  76. ]
  77. ```
  78. 第一列是`wall_time`,第二列是`step`,第三列是`value`
  79. ## Image
  80. 由于前端不能处理图片,所以图片请求分为两个地址
  81. 图片的信息,请求api:`api/image?run=.&tag=input_reshape/input/image/0`可获得tag为`input_reshape/input/image/0`的图片信息
  82. 其中`run`与`tag`缺一不可
  83. 返回数据格式
  84. ```python
  85. {
  86. "input_reshape/input/image/0":
  87. [
  88. {"wall_time": 1587176317.1721938, "step": 10, "width": 28, "height": 28},
  89. ...
  90. {"wall_time": 1587176425.348953, "step": 190, "width": 28, "height": 28}
  91. ]
  92. }
  93. ```
  94. 拿到图片信息之后,再向后台请求图片
  95. 请求api:`api/image_raw?step=0&run=.&tag=input_reshape/input/image/0`可获得tag为`input_reshape/input/image/0`在第0代时候的图片
  96. 其中`step`、`run`与`tag`缺一不可
  97. 返回数据为图像本身
  98. ## Histogram
  99. 请求api:`api/histogram?run=.&tag=layer1/weights/summaries/histogram/histogram_summary`可获得tag为`layer1/weights/summaries/histogram/histogram_summary`的数据
  100. 其中`run`与`tag`缺一不可
  101. 返回数据格式
  102. ```json
  103. {
  104. "layer1/activations/histogram_summary":
  105. [
  106. [1587176317.1721938, 10, 0.0, 5.297224044799805,
  107. [[0.0, 0.17657413482666015, 2801825.0],
  108. ...
  109. [5.120649909973144, 5.297224044799805, 2.0]]
  110. ],
  111. ...
  112. [1587176425.348953, 190, 0.0, 6.3502936363220215,
  113. [[0.0, 0.2116764545440674, 3229943.0],
  114. ...
  115. [6.1386171817779545, 6.3502936363220215, 8.0]]
  116. ]
  117. ]
  118. }
  119. ```
  120. 格式为
  121. ```json
  122. [
  123. wall_time, step, min, max,
  124. [[left, right, num],
  125. ...
  126. [left, right, num]]
  127. ]
  128. ```
  129. ## Distribution
  130. 请求api:`api/distribution?run=.&tag=layer1/weights/summaries/histogram/histogram_summary`可获得tag为`layer1/weights/summaries/histogram/histogram_summary`的数据
  131. 其中`run`与`tag`缺一不可
  132. 返回数据格式
  133. ```json
  134. {"layer1/activations/histogram_summary":
  135. [
  136. [1587176310.3070214, 0,
  137. [[0, 0.0], [668, 0.020253705367086237],..., [10000, 4.971314430236816]]],
  138. ...,
  139. [1587176419.1604998, 180,
  140. [[0, 0.0], [668, 0.021192153914175192],..., [10000, 6.3502936363220215]]]
  141. ]
  142. }
  143. ```
  144. 格式为
  145. ```json
  146. [
  147. wall_time, step,
  148. [[precentage, value],...,[precentage, value]]
  149. ]
  150. ```
  151. precentage取值分别为0, 668, 1587, 3085, 5000, 6915, 8413, 9332, 10000 对应标准正态分布的百分位数。
  152. ## Text
  153. 请求api:`api/text?run=.&tag=custom_tag`可获得tag为`custom_tag`的数据
  154. 其中`run`与`tag`缺一不可(目前只有一个数据集,run可随意给,不进行校验)
  155. 返回数据格式
  156. ```json
  157. {
  158. "custom_tag":
  159. [
  160. {"wall_time": 1585807655.373738, "step": 0,
  161. "value": "\u8fd9\u662f\u7b2c0\u53e5\u8bdd"},
  162. ...,
  163. {"wall_time": 1585807656.327519, "step": 99,
  164. "value": "\u8fd9\u662f\u7b2c99\u53e5\u8bdd"}
  165. ]
  166. }
  167. ```
  168. ## Audio
  169. 与图片类似,由于前端不能处理音频,所以音频请求分为两个地址
  170. 音频的信息,请求api:`api/audio?run=.&tag=waveform/audio_summary`可获得tag为`waveform/audio_summary`的音频信息
  171. 其中`run`与`tag`缺一不可(目前只有一个数据集,run可随意给,不进行校验)
  172. 返回数据格式
  173. ```json
  174. {
  175. "waveform/audio_summary":
  176. [
  177. {"wall_time": 1587475006.5022004, "step": 1, "label": "<p><em>Wave type:</em> <code>sine_wave</code>. <em>Frequency:</em> 448.98 Hz. <em>Sample:</em> 1 of 1.</p>", "contentType": "audio/wav"},
  178. ...
  179. {"wall_time": 1587475006.7304769, "step": 49, "label": "<p><em>Wave type:</em> <code>sine_wave</code>. <em>Frequency:</em> 880.00 Hz. <em>Sample:</em> 1 of 1.</p>", "contentType": "audio/wav"}
  180. ]
  181. }
  182. ```
  183. 拿到音频信息之后,再向后台请求音频
  184. 请求api:`api/audio_raw?step=0&run=.&tag=waveform/audio_summary`和得到音频
  185. 其中`step`、`run`与`tag`缺一不可(目前只有一个数据集,run可随意给,不进行校验)
  186. 返回数据为音频本身
  187. ## Embedding
  188. 高维数据,由于降维过程较为费时,数据首先在后端进行处理,然后返回降维后的数据。
  189. 具体请求也是分为两步,第一步根据run和tag得到数据对应的step信息。
  190. 1. 请求指定训练集和标签,返回对应标签的所有step和shape
  191. 请求`api` :`/api/projector?run=train&tag=outputs` 其中 run 、tag 缺一不可 返回数据格式如下:
  192. ```python
  193. {
  194. "outputs": [0, 1, 2, ... ,n],
  195. "shape": [n,m]
  196. }
  197. ```
  198. 2. 请求指定训练集,标签,step,method,dims 返回降维后的数据和原始标签
  199. 请求`api` :`api/projector_data?run=train&tag=outputs&step=0&method=pca&dims=3` ,其中 run 、tag、step、method 缺一不可,dims默认为3。返回数据格式如下:
  200. ```python
  201. {
  202. "0": [
  203. # 降维后的数据
  204. [[-1.5627723114617857, -3.9668523435955056, -0.18872563897943656],
  205. [-1.5627723114617857, -3.9668523435955056, -0.18872563897943656],
  206. [-1.5627723114617857, -3.9668523435955056, -0.18872563897943656],
  207. .....
  208. [-1.5627723114617857, -3.9668523435955056, -0.18872563897943656]],
  209. # label信息
  210. [7,0,5,6,7,1,...,9,6,4]
  211. ]
  212. }
  213. ```
  214. 3. 请求指定训练集,标签,序号 返回原始训练数据
  215. 请求`api` :api/projector_sample?run=.&tag=outputs&index=0 ,其中 run 、tag、index 缺一不可。返回原始数据:图片,音频,文本
  216. ## Graph
  217. 由于计算图graph每个网络中只包含一个,所以请求时只需给定run参数即可
  218. 请求`api` :`/api/graph?run=train`
  219. 返回run为train的计算图,数据格式为
  220. ```json
  221. {
  222. "net": "[{...}]", //graph计算图数据
  223. "operator": "[...]" //操作结点分类数据
  224. }
  225. ```
  226. ## exception
  227. 异常信息目前以projector的方式进行存取,标签信息请查看embedding(tag以 "**Variable:0**" 结尾)。
  228. 具体请求分为两步:
  229. 1. 请求指定训练集和标签,返回对应标签的所有step
  230. 请求`api` :`/api/exception?run=train&tag=layer1/weights/Variable:0` 其中 run 、tag 缺一不可 返回数据格式如下:
  231. ```python
  232. {
  233. "layer1/weights/Variable:0": [0, 1, 2, ... ,n]
  234. }
  235. ```
  236. 2. 请求指定训练集,标签,step 返回平铺后的异常数据
  237. 请求`api` :`api/exception_data?run=train&tag=layer1/weights/Variable:0&step=0` ,其中 run 、tag、step缺一不可,返回数据格式如下:
  238. ```python
  239. {
  240. "0":[
  241. [c1,c2], # 平铺前的数据维度大小(长度不定)
  242. min,
  243. max,
  244. mean,
  245. [[-1.5627723114617857, -3.9668523435955056, -0.18872563897943656],
  246. [-1.5627723114617857, -3.9668523435955056, -0.18872563897943656],
  247. [-1.5627723114617857, -3.9668523435955056, -0.18872563897943656],
  248. .....
  249. [-1.5627723114617857, -3.9668523435955056, -0.18872563897943656]]
  250. ]
  251. }
  252. ```
  253. 3. 请求指定训练集,标签,step 返回异常数据的直方图信息
  254. 请求`api` :`api/exception_hist?run=train&tag=layer1/weights/Variable:0&step=0` ,其中 run 、tag、step缺一不可,返回数据格式如下
  255. ```python
  256. {
  257. "0":[
  258. min,
  259. max,
  260. [[left, right, count],
  261. [left, right, count],
  262. .....
  263. [left, right, count]]
  264. ]
  265. }
  266. ```
  267. ## Hyperparam
  268. 请求api: `api/hyperparm?run=hparams`,可获得(如果有数据的话)run为hparams的超参数数据
  269. 返回数据格式:
  270. ```
  271. {"hparamsInfo": [{groupid_1:
  272. {"hparams": [{"name": 超参数1, "data": 数据1}, ..., {"name": 超参数2, "data": 数据2}],
  273. "start_time_secs": 开始时间}
  274. }
  275. ,...,
  276. {groupid_n:
  277. {"hparams": [{"name": 超参数1, "data": 数据1}, ..., {"name": 超参数2, "data": 数据2}], // 多个超参数的名字与值
  278. "start_time_secs": 开始时间}
  279. }], // 超参数信息,可能有多个
  280. "metrics": [{"tag": 量度1, "value": [值1, 值2, ...., 值n]},..., {"tag": 量度n, "value": [值1, 值2, ...., 值n]}]}
  281. //超参数的量度,可能有多个。适用于所有的超参数信息
  282. ```
  283. 例如train中的超参数数据为:
  284. ```
  285. {"hparamsInfo": [{"3df0d7cf35bec5a33c9fe551db732c24df204d7886b226c5a41cce285d0d4fd5":
  286. {"hparams": [{"name": "num_units", "data": 32.0},
  287. {"name": "optimizer", "data": "sgd"},
  288. {"name": "dropout", "data": 0.2}],
  289. "start_time_secs": 1589421877.1109092}
  290. }], // 超参数信息,可能有多个
  291. "metrics": [{"tag": "accuracy", "value": [0.8216999769210815, 0.8241999745368958, 0.7746999859809875, 0.765999972820282, 0.8411999940872192, 0.8307999968528748, 0.7940999865531921, 0.7904999852180481]}]} //超参数的量度,可能有多个。适用于所有的超参数信息
  292. ```
  293. ## Transformer
  294. Transformer分为视觉Transformer和文本Transformer
  295. ### 视觉Transformer
  296. 请求api: `api/transformer?run=image&tag=transformer-img0&l=0&x=0&y=0&g=0&r=0`,l为模型第几层数据,x为交互时点击图像的x坐标,y为交互时点击图像的y坐标,g表示是否全局归一化,r表示全局归一化时注意力值缩放的比例。
  297. 返回数据格式:
  298. ```python
  299. {
  300. tag:{
  301. "img": img_data, # 图像数据
  302. "attn_map": attn_map_datas, # 图像点击区域所对应的注意力值
  303. "layer": l, # 返回的是第几层的数据
  304. }
  305. }
  306. ```
  307. 例如:
  308. ```python
  309. {
  310. "transformer-img0": {
  311. "img": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIA7", # 图像数据
  312. "attn_map": [
  313. "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAIAAAAlC+aJAAAViklEQVR4nF",
  314. "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAIAAAAlC+aJAAAbu0lEQVR4nD",
  315. ......
  316. "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAIAAAAlC+aJAAAW2UlEQVR4nE"
  317. ] # 图像点击区域所对应的第l层的注意力值
  318. "layer": "0", # 返回的是第几层的数据
  319. }
  320. }
  321. ```
  322. ### 文本Transformer
  323. 文本Transformer请求分为两步,首先请求文本数据,然后请求对应句子的注意力值。
  324. #### 请求文本数据
  325. 请求api: `api/transformer?run=text&tag=a-transformer-sentence`
  326. 返回数据格式:
  327. ```python
  328. {
  329. tag: [
  330. sentence1,
  331. sentence2,
  332. ......,
  333. sentence
  334. ]
  335. }
  336. ```
  337. 例如:
  338. ```python
  339. {
  340. "a-transformer-sentence": [
  341. "it's a charming and often affecting journey",
  342. "a gorgeous, witty , seductive movie.",
  343. ......
  344. "too slow , too long and too little happens"
  345. ]
  346. }
  347. ```
  348. #### 请求注意力值
  349. 请求api: `api/transformer?run=text&tag=a-transformer-0`
  350. 返回数据格式:
  351. ```python
  352. {
  353. tag:{
  354. "wall_time": 1654566787.412733,
  355. "step": 0,
  356. "data":{
  357. "attention": {
  358. "all":{
  359. "attn": attention_data, # 注意力值
  360. "left_text": sentence1, # 左侧句子的token
  361. "right_text": sentence2, # 右侧句子的token
  362. }
  363. }
  364. "bidrectional": "True", # 是否双向模型
  365. "default_filter": "all", # 默认filter,为all
  366. "displayMode": "light", # 显示方案(dark or light)
  367. "layer": "0", # 默认为0,0为显示层
  368. "head": "0" # 默认为0,0为显示头
  369. }
  370. }
  371. }
  372. ```
  373. 例如:
  374. ```python
  375. {
  376. 'a-transformer-0': {
  377. "wall_time": 1654566787.412733,
  378. "step": 0,
  379. "data":{
  380. "attention": {
  381. "all":{
  382. "attn": [[[[0.0354335643351078, 0.08718656003475189, 0.03417610377073288, ...]]],
  383. [[[0.35616645216941833, 0.01612984947860241, 0.01865621656179428, ...]]],
  384. ...]# 注意力值
  385. "left_text": ["[cls]", "it", "is", "a", "charming", "journey"], # 左侧句子的token
  386. "right_text": ["[cls]", "it", "is", "a", "charming", "journey"], # 右侧句子的token
  387. }
  388. }
  389. "bidrectional": "True", # 是否双向模型
  390. "default_filter": "all", # 默认filter,为all
  391. "displayMode": "light", # 显示方案(dark or light)
  392. "layer": "0", # 默认为0,0为显示层
  393. "head": "0" # 默认为0,0为显示头
  394. }
  395. }
  396. }
  397. ```
  398. ## featuremap
  399. #### 请求特征图数据
  400. 请求api: `api/featuremap?run=featuremap&tag=SequentialtoConv2d[0]-GradCam&range=0&task=Classification`
  401. tag为‘该层结构图uid属性+特征图方法’;range为请求图片起始位置,一次请求16张图片;task为模型任务('Classification', 'Segmentation', 'Detection')
  402. 返回数据格式:
  403. ```python
  404. {
  405. SequentialtoConv2d[0]-GradCam: [
  406. {
  407. "wall_time": "1652704541.6665807",
  408. "step": 0,
  409. "Remaining_pictures": 0, #剩余特征图张数
  410. "label": label, #模型识别的真实标签
  411. "sorce_data": sorce, #模型预测结果
  412. "value": featuremap_data #特征图数据
  413. }
  414. ]
  415. }
  416. ```
  417. 例如:
  418. ```python
  419. {
  420. SequentialtoConv2d[0]-GradCam: [
  421. {
  422. "wall_time": "1652704541.6665807",
  423. "step": 0,
  424. "Remaining_pictures": 0,
  425. "label": [1, 1],
  426. "sorce_data": [[0.9298991560935974, 0.07010085135698318], [0.36296913027763367, 0.637030839920044]], #模型预测结果
  427. "value":[
  428. "0": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOA...",
  429. "1": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOA..."
  430. ]
  431. }
  432. ]
  433. }
  434. ```
  435. ## state
  436. RNN隐状态可视化分为两步:首先获取全部维度的隐状态数据进行可视化。当前端传回需要匹配的模式后,返回匹配到的模式数据
  437. ### 请求隐状态数据
  438. 请求api: `api/state?run=rnn&tag=state&pos=0&range=24`
  439. pos为请求数据初始位置;range为请求字符数
  440. 返回数据格式:
  441. ```python
  442. {
  443. data:{
  444. "data:hidden_state_data, #隐状态数据
  445. "max": max_value, #隐状态最大值
  446. "min": min_value, #隐状态最小值
  447. "right": num, #右侧剩余字符串个数
  448. "word": word #请求字符串
  449. }
  450. }
  451. ```
  452. 例如:
  453. ```python
  454. {
  455. data:{
  456. "data:[[-0.016503384336829185, 0.07723195850849152, 0.014958282932639122, -0.024111060425639153,…],…],
  457. "max": 0.12384635955095291,
  458. "min": -0.15024906396865845,
  459. "right": 83,
  460. "word": "在用神经网络进行数字识别时,需要对神经网络进行训"
  461. }
  462. }
  463. ```
  464. ### 请求匹配模式数据
  465. 请求api: `api/state_select?run=rnn&tag=state&threshold=0&pattern=110`
  466. threshold为阈值;pattern为匹配模式:1为隐状态高于阈值,0为隐状态低于阈值
  467. 返回数据格式:
  468. ```python
  469. {
  470. data:res #匹配到的字符
  471. }
  472. ```
  473. 例如:
  474. ```python
  475. {
  476. data:[{id: 0, start_pos: 0, data: "在用神"}, {id: 1, start_pos: 3, data: "经网络"},…]
  477. }
  478. ```

一站式算法开发平台、高性能分布式深度学习框架、先进算法模型库、视觉模型炼知平台、数据可视化分析平台等一系列平台及工具,在模型高效分布式训练、数据处理和可视分析、模型炼知和轻量化等技术上形成独特优势,目前已在产学研等各领域近千家单位及个人提供AI应用赋能