者绝对是个大坑。
如图,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,就这样。