语音识别 之 阿里云nvidia-docker

者绝对是个大坑。

如图,NVIDIA Docker 整体工作架构包含几部分:

  • 硬件,服务器上安装了英伟达 GPU
  • 宿主机,安装了操作系统和 Cuda Driver,以及 Docker 引擎
  • 容器,包含容器 OS 用户空间,Cuda Toolkit,以及用户应用程序

最重要的是,宿主机上需要安装 cuda driver,容器内需要安装 cuda toolkit。容器内无需安装 cuda driver。

NVIDIA 提供了一些官方镜像,其中已经安装好了 cuda toolkit,但还是需要在宿主机安装 cuda driver。

个人理解:

  • 驱动的版本一定要能满足Cuda Toolkit,否则带不动
  • 宿主机上需要安装cuda驱动和nvidia-docker引擎,可以不安装cuda Toolkit
  • 升级驱动时,直接安装新驱动就行,覆盖旧的驱动
  • nvidia-smi和nvcc -V可以使用,但是torch.cuda.is_available()=False,这种情况可能是因为驱动版本较低

可以看到的确是进行端口映射了,应该是start.sh的问题
各个容器之间应该是互不相关的,但是它们的端口统统不能用说明是同一个问题,只检查animus的问题就可以解决问题。

首先呢,都是java问题。

用的apache服务器。apache基金会的大部分项目都是使用java语言开发。

问题呢,是

java.net.UnknownHostException: nls-cloud-admin-inner.alibaba.net

尝试了一下,根本打不开。那么这个代码是在哪里的呢?

mashape是java的开源网关。应该是配置的问题。

application.log也是一样的问题。

但是里面却又是nginx的配置文件。。。

但是它里面的server真的是taobao.com。。。

改容器是没用的,容器用完就删掉了。只有改service里的conf,里面有所有的conf。

并没有!真操蛋,但是外面的log都是一样的。

对,都是一样的。

那么这个问题究竟是什么意思呢?

nls-cloud-admin-inner是不是内部原理呢?看看内部原理。

感觉是开着的啊~

直接请求返回401错误,必须附带上用户信息。。。不知道是咋回事。。

直接请求只返回空白界面。

直接curl机器网址是根本不行的。

貌似发现容器没有IP地址。。。

那么很有可能用的是主机相同的ip,而打不开仅仅是因为防火墙的原因。

好像还真有这个防火墙,,,fire-wall-cmd这个东西。。。

firewall-cmd --add-port 75011/tcp --permanent

打开了卧槽。

nmap一下。。。

仍然还是没有发现,重启docker尝试一下。

查看开放端口

netstat -anp | grep 7501

发现已经被java tcp占用了啊?

关闭docker在重复一次。

果然关闭了卧槽,再重启一下试试。

TIME_WAIT是TCP三次握手什么的。

但令人自闭的是,nmap就是扫描到那几个端口啊?

现在仍然是关闭的,那么应该就是防火墙的原因了。。。毕竟里面是可以看到的。

查看防火墙开放端口:firewall-cmd --zone=public --list-ports

只开放了我这一个,我是不是做了什么不得了的事情啊?

端口开放了这么多,但是外面可见端口就这几个:

如果nmap详细扫描的话,nmap -sS -p 1-65535 125.77.202.194

-sS    TCP SYN扫描    nmap -sS 192.168.1.254   

详细搜出现这些。。。大多数都是无效的tcp访问。

关闭防火墙试试。。。。

systemctl stop firewalld.service

还是关闭的。。。

是没有指定外网的什么吗?

iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

即便暴露了,也是看不见外网地址的。

网络连接是有2方参与,自己就是“内部地址”,别人就是“外部地址”,就这么简洁。

再举个例子,你用浏览器打开百度网站时,自己的 IP 地址就是内部地址了,也叫“本地地址”,百度服务器的IP就是外部地址,也就“远程地址”。

防火墙的确也没开着啊?

那唯一可能就是这个服务器是一个集群,是要端口转发的。

唉,算了,反正证明了7501的确是那个java程序(关闭就会丢失),关键就是在于透不出去而已。

开启防火墙吧

systemctl start firewalld.service

netstat -anp | grep 7501

最后发现是云的安全组没有开,这是一个集群,每台电脑都有自己的防火墙,整个云还有安全组。

端口映射命令(80>8080):
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
重启后会失效。
保存命令:
service iptables save
centos7没有该命令:

service iptables save

解决方法:
1.先执行如下命令:

systemctl stop firewalld
systemctl mask firewalld
  • 1
  • 2

2.安装iptables services

yum install iptables-services
  • 1

3.设置开机启动

systemctl enable iptables
  • 1

4.重启iptables service

systemctl restart iptables
  • 1

5.执行保存配置命令

service iptables save

至此成功实现

又出现大问题了,就是那个网址识别不出来。。。

java.net.UnknownHostException: nls-cloud-admin-inner.alibaba.net: Name or service not known

应该是这个端口没有打开。

还有很多重要的服务没有被授权。。。

授权批下来了。

有一个大问题哦,还是有两个没解决,解决了一个。。。

发现问题了:

04:45:35.422 DEBUG [pool-4-thread-1] [    c.a.n.c.s.s.asr.lm.AsrLmModelWatcher] [                                ] Skip scan training models
04:50:25.399  INFO [pool-4-thread-1] [     c.a.n.c.s.l.ApesResourceLimiterImpl] [                                ] License check passed
04:50:35.399  INFO [pool-4-thread-1] [c.a.nls.cloud.balance.VipSrvBalancerImpl] [                                ] Vpc not enabled!
服务已经通过了,但是vpc不能使用之类的。

现在改了时间,是相当的难啊。。。只能等到明天再说。。。

更新新的激活码时,是否需要重启apes,是否需要重启各个服务?
如果是有效期变更,则⽆需重启,其他的授权项变更需要重启对应服务,apes本身不需要重启

也就是说,对应服务需要重启。。。专有网络未启用之类的,但是为什么成功了一个?

如果误操作重启了apes,是否需要重启各个服务?
不需要

理论上,重启没有问题。

选择任意⼀个节点执⾏下述所有操作,请勿中途换节点执⾏操作, 在未激活之前不允许重启进程,否则序列
号将⾃动变更。激活后可以进行重启,试一试。反正现在肯定激活好了。

查看授权信息

bin/apes.sh ctx

com.alibaba.nls.cloud.storage.StorageException: Failed to access mongodb!

从asr哪里出现的,这log真恶心。

为什么连不上数据库呢?
05:30:00.003  INFO [pool-4-thread-1] [c.a.nls.cloud.slp.service.StorageCleaner] [                                ] Stop scan, list is empty
05:30:35.524  INFO [pool-4-thread-1] [     c.a.n.c.s.l.ApesResourceLimiterImpl] [                                ] License check passed
05:30:45.524  INFO [pool-4-thread-1] [c.a.nls.cloud.balance.VipSrvBalancerImpl] [                                ] Vpc not enabled!
05:35:35.524  INFO [pool-4-thread-1] [     c.a.n.c.s.l.ApesResourceLimiterImpl] [                                ] License check passed
05:35:45.524  INFO [pool-4-thread-1] [c.a.nls.cloud.balance.VipSrvBalancerImpl] [                                ] Vpc not enabled!
05:35:45.526  INFO [pool-4-thread-1] [    c.a.n.c.s.s.asr.lm.AsrLmModelWatcher] [                                ] Try occupy redis key: nls.cloud.slp.lock.scan-lm
05:35:45.528 DEBUG [pool-4-thread-1] [    c.a.n.c.s.s.asr.lm.AsrLmModelWatcher] [                                ] Skip scan training models
这里是slp的,也是数据库的问题,emmmmm。

出现的问题

 Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool

slp的,是数据库的问题。

[2020-09-04 05:21:58.938] [ERROR] [474,build/release64/alisr/util/apes/apes_check.cpp -- IsInitCheckSuccess():40] [License not passed, failed to login to license server: apes: connect server[127.0.0.1] failed.code:-1 resp:request apes(curl) failed. Couldn't connect to server ]

asr的,仍然是授权的原因,怎么会这样啊?但与之前的稍有差别:

[2020-09-02 22:03:49.521] [ERROR] [384,build/release64/alisr/server/alisr_server.cpp -- Init():167] [License not passed!]
[2020-09-02 22:03:52.141] [ERROR] [401,build/release64/alisr/util/apes/apes_check.cpp -- IsInitCheckSuccess():40] [License not passed, failed to login to license server: apes: access violation (invalid request)[inactivated (未授权或者机器硬件有变更)]
]

现在是resp:request apes(curl) failed. Couldn't connect to server

org.mongodb.driver.cluster] [                                ] No server chosen by ReadPreferenceServerSelector{

仍然是asr的,emmmm,数据库的问题吧。

Try occupy redis key: nls.cloud.slp.lock.scan-lm

学一学redis吧。

数据库做不了是不是因为端口被占用的原因啊。。。

现在发现redis根本就没开着。。。

甚至都没有安装。。。但是docker应该不用安装啊?

实际上,数据库都是在其他容器内的。但是现在数据库的确都开启着。

redis的好多啊。。。

应该是redis数据库的原因,停掉试试。

但是现在发现这个端口并没有被占用,看看其他端口呢?

都没有被占用,那就奇怪了。。。

现在突然slp也好了,真是可喜可贺啊!!!虽然自己什么都没有做只是重启了一遍。

另外两个端口也没有任何问题啊?

现在就差一个asr了,好淦啊。

情况跟我预期的相反,里面的能用了,但是工程创建不起来?为什么?查一查。并没有出现500错误,真是淦了。

看看asr的log

accsee里什么都没有,custom-task里面也什么都没有,requeset里面也是什么都没有。。。

alis里面

[2020-09-04 05:21:58.938] [ERROR] [474,build/release64/alisr/server/alisr_server.cpp -- Init():166] [License not passed!]
[2020-09-04 05:21:58.938] [WARN] [474,build/release64/alisr/server/sr_server.cpp -- Stop():103] [SrServer is already stopped!]
[2020-09-04 22:19:51.388] [INFO] [285,build/release64/alisr/util/apes/apes_check.cpp -- IsInitCheckSuccess():55] [Got max connections from apes: 10]
[2020-09-04 22:19:51.517] [INFO] [285,build/release64/alisr/server/alisr_server.cpp -- Init():164] [License passed (type=server)!]

最后成功通过了,话说这个alis到底是什么啊?是ali-server吗?

而且现在时间全乱了。。。。

并没有发现什么有价值的。。。

欸?现在好像全部成功了。。。demo以下试试看。

团队能新建成功。。。

但应用新建不成功。。。

服务器没问题,api没问题,有问题的应该只是内部了,毕竟就这一个api有问题,看看容器内部如何。

nls-cloud-admin-inner.alibaba.net,是内部网址解析错误

http://125.77.202.194:7501/api/animus/nls/app/add?

这个docker真好用,我也在我的服务器上这么干,当然,编写一个脚本,那真的是太爽了,全自动执行。

它这个api是放在哪里的呢?例如python的服务器,它的api在setting里,非常核心。

你说这个网页是一个端口呢?还是一个ip呢?我觉得是ip。。。

23:30:55.690 DEBUG [pool-4-thread-1] [ c.a.n.c.s.s.asr.lm.AsrLmModelWatcher] [ ] Skip scan training models
23:35:45.674 INFO [pool-4-thread-1] [ c.a.n.c.s.l.ApesResourceLimiterImpl] [ ] License check passed
23:35:55.674 INFO [pool-4-thread-1] [c.a.nls.cloud.balance.VipSrvBalancerImpl] [ ] Vpc not enabled!
23:40:45.675 INFO [pool-4-thread-1] [ c.a.n.c.s.l.ApesResourceLimiterImpl] [ ] License check passed
23:40:55.674 INFO [pool-4-thread-1] [c.a.nls.cloud.balance.VipSrvBalancerImpl] [ ] Vpc not enabled!
23:40:55.690 INFO [pool-4-thread-1] [ c.a.n.c.s.s.asr.lm.AsrLmModelWatcher] [ ] Try occupy redis key: nls.cloud.s
lp.lock.scan-lm

现在全部解决了,只剩下一个域名解析不正确,既然是一个域名,那么就不可能应该是有端口的,域名联系端口?不能坑。

nls-cloud-admin-inner.alibaba.net

现在人家也不让你重启网络,那么怎么刷新hosts呢?

现在没有任何问题,全绿了。就是这个域名是老大难。

hosts不会立即生效,但是它肯定过几个小时就会生效。

等等,要开8701端口!

http://125.77.202.194:7501/api/animus/nls/app/add?

{"resultCode":1,"resultMessage":"java.net.UnknownHostException: nls-cloud-admin-inner.alibaba.net","data":null}

post也不知道post了什么,但是应该不是前端的问题,是后端的问题 。

我从哪里找到这条语句呢?它既然发送到7501端口,说明api就在那里,看看吧,

nls-cloud-admin

这个容器没有安装,是不是这个的问题?

这个网页用的大概就是nginx。log又好像apache。它可能是nginx做前端,apache做后端这样。

既然是apache报错的,那么就可能是apache找不到这个 网址,也就是apache的网页脚本出问题了,后台应该是java做的。

而java会被打包成一个war包,这是Java web的特色。。。

看来docker容器会复制本计算机上的环境,至少它会复制hosts,这里就发现并没有添加上这个dns,如果重启一次应该可以解决问题,但是我不想冒这个险。

哈哈,看来添加上就能直接解析了。删除或修改也是立即触发的。。

但是现在请求返回异常,说明不是本地。。。

删掉又出现原来的情况,如果不是本地,那会是什么呢?

反正问题就是在这里了。

抛出的错误为

java.lang.NullPointerException: null

at com.alibaba.nls.animus.meta.RestUtils.checkResult(RestUtils.java:93)
at com.alibaba.nls.animus.meta.RestUtils.checkResultToMap(RestUtils.java:41)
at com.alibaba.nls.animus.meta.service.NlsMetaService.create(NlsMetaService.java:89)

怎么回事呢?

2020-09-05 06:28:01.663 INFO [nls-cloud-unify-post] [pool-3-thread-1] [] [c.a.n.c.balance.VipSrvBalancerImpl] [] [] [] Vpc not enabled!

难道真的是少开了一个容器?

基于vpc not enable,我猜测少开了一个容器。

[INFO] [nls-cloud-admin] 容器未发现, 默许为用户选装, 自动忽略

应该是这个容器。。。

这个应用有什么用啊?貌似没什么用啊???

现在asr又不行了卧槽,唉。就这一个不行,是不是一直重启的问题啊?还是别的什么?

应该是花时间的,花半个小时,解决问题这样。

只要等上半小时就好。

必须创建应用!!!但是现在根本没办法创建应用。。。

绝对slp出现问题了。

只能放在animus上,放到slp上都不可以,它们都复制了宿主的hosts文件。

你注意的是,nls-cloud-admin-inner是否是一个容器呢?

我怀疑是少一个容器。

我怀疑是少这个容器。

现在用命令行来做怎么样呢?

基础模型训练完了,现在导入出错

当然了,先导进去:

curl -X POST --header 'Content-Type: multipart/form-data' \
--header 'Accept: application/json' \
--header 'X-NLS-Token: default' \
-F "path=slp/tmp/test-data-am.zip" \
-F "file=@/data1/ali/data/demo-data-8k-plain.zip" \
'http://nls-slp.aliyun.test:8701/api/v3/files/upload'

现在创建一个数据集:

curl -X POST \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'X-NLS-User: default' \
--header 'X-NLS-Token: default' \
-d '{
"id": "test-data",
"name": "测试数据",
"description": "这是一个测试数据",
"url": "slp/tmp/test-data-am.zip",
"sample_rate": 8000,
"format_type": "PLAIN"
}' 'http://nls-slp.aliyun.test:8701/api/v2/asr/am/data'

采样率是多少呢?采样率就是8k。

接下来就是运算了

curl -X GET \
--header 'Accept: application/json' \
--header 'X-NLS-User: default' \
--header 'X-NLS-Token: default' \
'http://nls-slp.aliyun.test:8701/api/v2/asr/am/data/test-data'

接下来进行数据处理

curl -X POST \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'X-NLS-User: default' \
--header 'X-NLS-Token: default' \
'http://nls-slp.aliyun.test:8701/api/v2/asr/am/operations/process-data?data_id=test-data&base_id=common'

接下来是查看数据集状态:

curl -X GET \
--header 'Accept: application/json' \
--header 'X-NLS-User: default' \
--header 'X-NLS-Token: default' \
'http://nls-slp.aliyun.test:8701/api/v2/asr/am/data/test-data'

倒是训练好了。。。

创建定制模型:

curl -X POST \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'X-NLS-User: default' \
--header 'X-NLS-Token: default' \
-d '{
"id": "test-model",
"name": "测试模型",
"description": "这是一个测试模型",
"base_id": "common"
}' 'http://nls-slp.aliyun.test:8701/api/v2/asr/am/models'

绑定数据集:

curl -X POST \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'X-NLS-User: default' \
--header 'X-NLS-Token: default' \
'http://nls-slp.aliyun.test:8701/api/v2/asr/am/operations/add-data-to-model?data_id=test-data&model_id=test-model'

训练模型:

curl -X POST \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'X-NLS-User: default' \
--header 'X-NLS-Token: default' \
'http://nls-slp.aliyun.test:8701/api/v2/asr/am/operations/train-model?model_id=test-model'



我擦开始训练了。

查看进度:

curl -X GET \
--header 'Accept: application/json' \
--header 'X-NLS-User: default' \
--header 'X-NLS-Token: default' \
'http://nls-slp.aliyun.test:8701/api/v2/asr/am/models/test-model'

声学训练需要至少0.8小时的数据,否则训练会报错。

现在是真正的模型了,先导入数据:

curl -X POST --header 'Content-Type: multipart/form-data' \
--header 'Accept: application/json' \
--header 'X-NLS-Token: default' \
-F "path=slp/tmp/sjt-data.zip" \
-F "file=@/data1/ali/data/sjt-data.zip" \
'http://nls-slp.aliyun.test:8701/api/v3/files/upload'

对,就叫minnanyu-data,就是这个数据集。

curl -X POST \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'X-NLS-User: default' \
--header 'X-NLS-Token: default' \
-d '{
"id": "sjt-data",
"name": "闽南语数据堂数据",
"description": "这是一个闽南语数据堂数据",
"url": "slp/tmp/sjt-data.zip",
"sample_rate": 16000,
"format_type": "PLAIN"
}' 'http://nls-slp.aliyun.test:8701/api/v2/asr/am/data'

创建很容易啊。。。不,它只是立即返回而已,查看如下

curl -X GET \
--header 'Accept: application/json' \
--header 'X-NLS-User: default' \
--header 'X-NLS-Token: default' \
'http://nls-slp.aliyun.test:8701/api/v2/asr/am/data/sjt-data'

可别出错啊。。。

还是出错了。。。

行了!

定制模型

curl -X POST \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'X-NLS-User: default' \
--header 'X-NLS-Token: default' \
-d '{
"id": "sjt-model",
"name": "数据堂闽南语模型",
"description": "这是数据堂闽南语模型",
"base_id": "common16k"
}' 'http://nls-slp.aliyun.test:8701/api/v2/asr/am/models'

绑定数据集:

curl -X POST \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'X-NLS-User: default' \
--header 'X-NLS-Token: default' \
'http://nls-slp.aliyun.test:8701/api/v2/asr/am/operations/add-data-to-model?data_id=sjt-data&model_id=sjt-model'

绑定不了,要基础模型是16k的,这里只是8k的。

看看能不能配置自己的基础模型:

curl -X POST \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'X-NLS-User: default' \
--header 'X-NLS-Token: default' \
-d '{
"id": "common16k",
"name":"通用模型16k",
"description":"通用领域模型16k",
"sample_rate": 16000,
"resource_path": "slp/v2/asr/am/inputs/common-resource.zip",
"init_model_path": "slp/v2/asr/am/inputs/common-am.net",
"init_model_trans_path": "slp/v2/asr/am/inputs/common-am.mvn"
}' 'http://nls-slp.aliyun.test:8701/api/v2/asr/am/bases'

行了,重新创建模型:

curl -X POST \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'X-NLS-User: default' \
--header 'X-NLS-Token: default' \
-d '{
"id": "sjt-model",
"name": "数据堂闽南语模型",
"description": "这是数据堂闽南语模型",
"base_id": "common16k"
}' 'http://nls-slp.aliyun.test:8701/api/v2/asr/am/models'

绑定数据:

curl -X POST \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'X-NLS-User: default' \
--header 'X-NLS-Token: default' \
'http://nls-slp.aliyun.test:8701/api/v2/asr/am/operations/add-data-to-model?data_id=sjt-data&model_id=sjt16kk-model'

训练!

curl -X POST \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'X-NLS-User: default' \
--header 'X-NLS-Token: default' \
'http://nls-slp.aliyun.test:8701/api/v2/asr/am/operations/train-model?model_id=sjt16kk-model'

查看:

curl -X GET \
--header 'Accept: application/json' \
--header 'X-NLS-User: default' \
--header 'X-NLS-Token: default' \
'http://nls-slp.aliyun.test:8701/api/v2/asr/am/models/sjt16kk-model'

期望不要再有什么错误了。

最后仍然还是错了,删删模型与数据吧。

列举数据集:

curl -X GET \
--header 'Accept: application/json' \
--header 'X-NLS-User: default' \
--header 'X-NLS-Token: default' \
'http://nls-slp.aliyun.test:8701/api/v2/asr/lm/data'

一个数据也没有?

删除数据:

curl -X DELETE \
--header 'Accept: application/json' \
--header 'X-NLS-User: default' \
--header 'X-NLS-Token: default' \
'http://nls-slp.aliyun.test:8701/api/v2/asr/am/data/xxx'

列举模型:

curl -X GET \
--header 'Accept: application/json' \
--header 'X-NLS-User: default' \
--header 'X-NLS-Token: default' \
'http://nls-slp.aliyun.test:8701/api/v2/asr/lm/models'

只有一个demo模型。。。我不是创建了好多吗?

应该是一旦出错就删掉吧。。。

但是早已经存在了啊?都是存在的。。。那就都删掉。

curl -X DELETE \
--header 'Accept: application/json' \
--header 'X-NLS-User: default' \
--header 'X-NLS-Token: default' \
'http://nls-slp.aliyun.test:8701/api/v2/asr/lm/models/sjt-model'

找不到,,,可笑。写一个脚本吧。

这是语言模型的。。。

现在数据叫sjt-data,模型叫sjt-model,继承自common16k,就这样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值