2019년 11월 13일 수요일
Redhat ppc64le 서버에서 logstash를 설치하고 구성하기
IBM POWER9 서버, 즉 ppc64le 아키텍처 기반의 Redhat 서버에 logstash를 설치하고 구성하는 것을 간단히 해보겠습니다.
먼저, logstash는 java 기반이기 때문에, 그냥 x86_64용으로 elastic.co에서 제공되는 RPM 파일을 그냥 그대로 받아다 설치해서 쓰시면 됩니다.
[user607@p607-kvm1 ~]$ wget https://artifacts.elastic.co/downloads/logstash/logstash-7.4.2.rpm
[user607@p607-kvm1 ~]$ sudo rpm -Uvh logstash-7.4.2.rpm
warning: logstash-7.4.2.rpm: Header V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY
Verifying... ################################# [100%]
Preparing... ################################# [100%]
Updating / installing...
1:logstash-1:7.4.2-1 ################################# [100%]
Using provided startup.options file: /etc/logstash/startup.options
OpenJDK 64-Bit Server VM warning: TieredCompilation is disabled in this release.
/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/pleaserun-0.0.30/lib/pleaserun/platform/base.rb:112: warning: constant ::Fixnum is deprecated
Successfully created system startup script for Logstash
다만 이걸 그대로 수행해보시면 아래와 같이 "load error: ffi/ffi" error가 나는 것을 보실 수 있습니다.
[root@p607-kvm1 user607]# /usr/share/logstash/bin/logstash
Thread.exclusive is deprecated, use Thread::Mutex
WARNING: Could not find logstash.yml which is typically located in $LS_HOME/config or /etc/logstash. You can specify the path using --path.settings. Continuing using the defaults
Could not find log4j2 configuration at path /usr/share/logstash/config/log4j2.properties. Using default config which logs errors to the console
[INFO ] 2019-11-12 23:56:52.605 [main] writabledirectory - Creating directory {:setting=>"path.queue", :path=>"/usr/share/logstash/data/queue"}
[INFO ] 2019-11-12 23:56:52.633 [main] writabledirectory - Creating directory {:setting=>"path.dead_letter_queue", :path=>"/usr/share/logstash/data/dead_letter_queue"}
[ERROR] 2019-11-12 23:56:53.198 [LogStash::Runner] Logstash - java.lang.IllegalStateException: Logstash stopped processing because of an error: (LoadError) load error: ffi/ffi -- java.lang.NullPointerException: null
이는 https://github.com/elastic/logstash/issues/10755 에 기술된 bug 때문인데, 요약하면 jruby-complete-*.jar 파일 안의 powerpc64le-linux platform을 위한 directory에 실수로 platform.conf가 빠져 있기 때문에 발생하는 것입니다. 이는 아래와 같은 command로 간단히 확인하실 수 있습니다. 일단 아래와 같이 error가 나는지 확인하십시요.
[root@p607-kvm1 user607]# java -jar /usr/share/logstash/logstash-core/lib/jars/jruby-complete-9.2.8.0.jar -rffi -e 1
LoadError: load error: ffi/ffi -- java.lang.NullPointerException: null
require at org/jruby/RubyKernel.java:987
require at uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/rubygems/core_ext/kernel_require.rb:54
<main> at uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/ffi.rb:1
require at org/jruby/RubyKernel.java:987
(root) at uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/rubygems/core_ext/kernel_require.rb:1
확인되면 아래와 같이 powerpc64le-linux/types.conf 파일을 추출해내십시요.
[root@p607-kvm1 user607]# jar -xvf /usr/share/logstash/logstash-core/lib/jars/jruby-complete-9.2.8.0.jar META-INF/jruby.home/lib/ruby/stdlib/ffi/platform/powerpc64le-linux/types.conf
inflated: META-INF/jruby.home/lib/ruby/stdlib/ffi/platform/powerpc64le-linux/types.conf
이 파일을 다음과 같이 powerpc64le-linux/platform.conf로 copy하십시요.
[root@p607-kvm1 user607]# cp META-INF/jruby.home/lib/ruby/stdlib/ffi/platform/powerpc64le-linux/types.conf META-INF/jruby.home/lib/ruby/stdlib/ffi/platform/powerpc64le-linux/platform.conf
이렇게 만들어진 powerpc64le-linux/platform.conf을 원래의 jruby-complete-*.jar 파일에 update하십시요.
[root@p607-kvm1 user607]# jar -uvf /usr/share/logstash/logstash-core/lib/jars/jruby-complete-9.2.8.0.jar META-INF/jruby.home/lib/ruby/stdlib/ffi/platform/powerpc64le-linux/platform.conf
adding: META-INF/jruby.home/lib/ruby/stdlib/ffi/platform/powerpc64le-linux/platform.conf(in = 3796) (out= 483)(deflated 87%)
이제 다시 테스트해보면 "load error: ffi/ffi"가 더 발생하지 않는 것을 보실 수 있습니다.
[root@p607-kvm1 user607]# java -jar /usr/share/logstash/logstash-core/lib/jars/jruby-complete-9.2.8.0.jar -rffi -e 1
[root@p607-kvm1 user607]# echo $?
0
이제 간단한 logstash config 파일을 작성합니다. 여기서는 /tmp/in.log에 뭔가 내용이 쌓이면 그걸 grok으로 filtering한 뒤 rubydebug codec으로 format하여 /tmp/out.log에 집어넣는 것입니다.
[root@p607-kvm1 user607]# vi logstash-simple.conf
input {
file {
path => "/tmp/in.log"
}
}
filter {
grok {
match => { "message" => "%{NUMBER:timestamp} %{NUMBER:channel} %{MAC:client_mac} %{MAC:mac} %{INT:rssi}" }
}
}
output {
file {
path => "/tmp/out.log"
}
stdout { codec => rubydebug }
}
아래와 같이 logstash를 start 합니다.
[root@p607-kvm1 user607]# /usr/share/logstash/bin/logstash -f logstash-simple.conf
Thread.exclusive is deprecated, use Thread::Mutex
WARNING: Could not find logstash.yml which is typically located in $LS_HOME/config or /etc/logstash. You can specify the path using --path.settings. Continuing using the defaults
Could not find log4j2 configuration at path /usr/share/logstash/config/log4j2.properties. Using default config which logs errors to the console
[WARN ] 2019-11-13 00:23:47.244 [LogStash::Runner] multilocal - Ignoring the 'pipelines.yml' file because modules or command line options are specified
[INFO ] 2019-11-13 00:23:47.267 [LogStash::Runner] runner - Starting Logstash {"logstash.version"=>"7.4.2"}
[INFO ] 2019-11-13 00:23:50.305 [Converge PipelineAction::Create<main>] Reflections - Reflections took 75 ms to scan 1 urls, producing 20 keys and 40 values
[WARN ] 2019-11-13 00:23:52.059 [[main]-pipeline-manager] LazyDelegatingGauge - A gauge metric of an unknown type (org.jruby.RubyArray) has been create for key: cluster_uuids. This may result in invalid serialization. It is recommended to log an issue to the responsible developer/development team.
[INFO ] 2019-11-13 00:23:52.065 [[main]-pipeline-manager] javapipeline - Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>16, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50, "pipeline.max_inflight"=>2000, :thread=>"#<Thread:0x370844ca run>"}
[INFO ] 2019-11-13 00:23:52.938 [[main]-pipeline-manager] file - No sincedb_path set, generating one based on the "path" setting {:sincedb_path=>"/usr/share/logstash/data/plugins/inputs/file/.sincedb_b3374bae0eefd65d5f3cdbcfd41ca004", :path=>["/tmp/in.log"]}
[INFO ] 2019-11-13 00:23:52.992 [[main]-pipeline-manager] javapipeline - Pipeline started {"pipeline.id"=>"main"}
[INFO ] 2019-11-13 00:23:53.081 [[main]<file] observingtail - START, creating Discoverer, Watch with file and sincedb collections
[INFO ] 2019-11-13 00:23:53.089 [Agent thread] agent - Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[INFO ] 2019-11-13 00:23:53.488 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9600}
여기서 다음과 같이 일정 format의 string을 /tmp/in.log에 집어넣습니다.
[root@p607-kvm1 user607]# echo "1524708231.794252221 8 c0:4a:00:40:e6:0e c0:4a:00:40:AA:AA -68" >> /tmp/in.log
그러면 logstash의 standard output log에 아래와 같이 그에 대한 처리가 되는 메시지가 나오는 것을 보실 수 있습니다.
[INFO ] 2019-11-13 00:24:54.175 [[main]>worker9] file - Opening file {:path=>"/tmp/out.log"}
/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/awesome_print-1.7.0/lib/awesome_print/formatters/base_formatter.rb:31: warning: constant ::Fixnum is deprecated
{
"@timestamp" => 2019-11-13T05:24:53.785Z,
"path" => "/tmp/in.log",
"@version" => "1",
"host" => "p607-kvm1",
"tags" => [
[0] "_grokparsefailure"
],
"message" => "1524708231.794252221 8 c0:4a:00:40:e6:0e c0:4a:00:40:AA:AA -68"
}
[INFO ] 2019-11-13 00:25:11.708 [[main]>worker9] file - Closing file /tmp/out.log
그리고 그 결과로 아래와 같이 format된 string이 지정된 file로 저장된 것을 보실 수 있습니다.
[root@p607-kvm1 user607]# cat /tmp/out.log
{"@timestamp":"2019-11-13T05:24:53.785Z","path":"/tmp/in.log","@version":"1","host":"p607-kvm1","tags":["_grokparsefailure"],"message":"1524708231.794252221 8 c0:4a:00:40:e6:0e c0:4a:00:40:AA:AA -68"}
2019년 11월 4일 월요일
IBM POWER 가상머신에서의 RPS(Receive Packet Steering)을 이용한 network performance tuning
IBM Virtual Machine에서는 다음과 같이 RSS(Receive Side Scaling)가 receive (input) queue 1개로 제한됩니다. 아래는 POWER8 KVM 환경입니다.
[user607@p607-kvm2 ~]$ egrep 'CPU|virtio0' /proc/interrupts
CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7 CPU8 CPU9 CPU10 CPU11 CPU12 CPU13 CPU14 CPU15
47: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 XICS 4126 Edge virtio0-config
48: 48 0 0 0 0 0 0 0 0 57548404 0 0 0 0 0 0 XICS 4127 Edge virtio0-input.0
49: 1 0 0 0 0 0 0 4414 0 0 0 0 0 0 0 0 XICS 4128 Edge virtio0-output.0
이 queue의 interrupt를 어떤 CPU가 처리하는지는 아래와 같이 찾을 수도 있습니다.
[user607@p607-kvm2 ~]$ sudo find /sys/devices -name "*eth0*"
/sys/devices/pci0000:00/0000:00:01.0/virtio0/net/eth0
[user607@p607-kvm2 ~]$ ls -l /sys/devices/pci0000:00/0000:00:01.0/msi_irqs
total 0
-r--r--r-- 1 root root 65536 Oct 31 22:47 47
-r--r--r-- 1 root root 65536 Oct 31 22:47 48
-r--r--r-- 1 root root 65536 Oct 31 22:47 49
virtio0-input.0, 즉 48번의 interrupt를 처리하는 CPU를 찾기 위해 /proc/irq/해당번호/smp_affinity 파일을 확인합니다.
[user607@p607-kvm2 ~]$ cat /proc/irq/48/smp_affinity
0200
위 숫자 string은 각 숫자 하나가 CPU 4개를 가리키는 16진수이며, 이를 2진수로 풀어놓으면 다음과 같습니다. (16진수 2은 2^1이므로 2진수로는 0010 입니다)
(16진수) 0200
(2진수) 0000 0010 0000 0000
각각의 2진수 숫자는 CPU 1개를 뜻하며, 뒤쪽부터 CPU0, CPU1, CPU2...를 표시합니다. 1로 표시된 CPU가 이 interrupt를 처리하는데 사용되는 CPU를 뜻합니다.
즉 총 16개의 CPU 중에서 (뒤쪽부터 셉니다) 10번째의 CPU가 이 interrupt를 처리한다는 뜻입니다. 맨 위에서 /proc/interrupts로 확인한 정보와 일치합니다.
이렇게 receive side queue가 1개 뿐이라면 혹시 heavy network traffic이 몰려들어올 때 해당 interrupt를 처리하는 CPU가 100% 차서 병목이 되는 일이 없을까요 ? 그 부분을 확인해보기 위해 network 부하 테스트 tool인 iperf를 설치하겠습니다.
[user607@p607-kvm2 ~]$ sudo yum groupinstall "Development Tools"
[user607@p607-kvm2 ~]$ wget https://iperf.fr/download/source/iperf-3.1.3-source.tar.gz
[user607@p607-kvm2 ~]$ tar -xf iperf-3.1.3-source.tar.gz
[user607@p607-kvm2 ~]$ cd iperf-3.1.3
[user607@p607-kvm2 iperf-3.1.3]$ ./configure
[user607@p607-kvm2 iperf-3.1.3]$ make -j8 && sudo make install
[user607@p607-kvm2 iperf-3.1.3]$ iperf3 -s -p 5021
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
충분한 부하를 주기 위해, 이것 외에도 다음과 같이 5022~5024 port를 이용해 총 4개의 iperf3 server process를 구동해놓습니다.
[user607@p607-kvm2 iperf-3.1.3]$ iperf3 -s -p 5022
[user607@p607-kvm2 iperf-3.1.3]$ iperf3 -s -p 5023
[user607@p607-kvm2 iperf-3.1.3]$ iperf3 -s -p 5024
그리고 다른 서버에서 다음과 같이 이 4개 port에 대해 iperf3 client를 구동하여 작은 size의 packet들을 30초간 보냅니다.
user607@p607-kvm1:~$ user607@p607-kvm1:~$ for i in 1 2 3 4
> do
> iperf3 -c 129.40.252.107 -P 6 -t 30 -N -l 16 -p 502${i} &
> done
이렇게 해보면 다음과 같이 10번째 CPU가 정말 거의 95%에 달하는 것을 보실 수 있습니다. 다른 CPU들은 iperf3 server process들이 CPU를 100%씩 쓰고 있는 것입니다.
이 문제를 해결할 방법이 없을까요 ? 있습니다. RPS(Receive Packet Steering)가 그것인데, 이는 쉽게 말해 RSS와 같은 것이지만 RSS가 HW적인 구현인 것에 비해 RPS는 SW적인 구현이라는 것입니다. 이건 기본적으로는 disable 처리되어 있습니다. Disable 처리 여부는 다음과 같이 "...eth#/queues/rx-0/rps_cpus 파일에 할당된 CPU를 보고 확인하실 수 있습니다.
[user607@p607-kvm2 ~]$ sudo find / -name queues
/sys/devices/pci0000:00/0000:00:01.0/virtio0/net/eth0/queues
/sys/devices/virtual/net/lo/queues
[user607@p607-kvm2 ~]$ ls -l /sys/devices/pci0000:00/0000:00:01.0/virtio0/net/eth0/queues/
total 0
drwxr-xr-x. 3 root root 0 Oct 29 18:57 rx-0
drwxr-xr-x. 3 root root 0 Oct 29 18:57 tx-0
[user607@p607-kvm2 ~]$ ls -l /sys/devices/pci0000:00/0000:00:01.0/virtio0/net/eth0/queues/rx-0
total 0
-rw-r--r--. 1 root root 65536 Oct 31 02:18 rps_cpus
-rw-r--r--. 1 root root 65536 Oct 31 02:18 rps_flow_cnt
drwxr-xr-x. 2 root root 0 Oct 29 18:58 virtio_net
[user607@p607-kvm2 ~]$ cat /sys/devices/pci0000:00/0000:00:01.0/virtio0/net/eth0/queues/rx-0/rps_cpus
0000
이렇게 0000이 들어있는 것은 disable되어 있다는 것입니다. 기본적으로 disable 처리가 된 것은 RSS로 multi-queue 처리가 된다면 굳이 RPS까지 함께 구현할 필요가 없기 떄문입니다. 그러나 Virtual 환경처럼 RSS에서 single-queue로만 처리가 되는 경우에는 도움이 될 수도 있습니다.
RPS를 enable하기 위해서는 다음과 같이 그 처리를 해줄 CPU를 지정해주면 됩니다.
[root@p607-kvm2 user607]# echo "1001" > /sys/devices/pci0000:00/0000:00:01.0/virtio0/net/eth0/queues/rx-0/rps_cpus
[root@p607-kvm2 user607]# cat /sys/devices/pci0000:00/0000:00:01.0/virtio0/net/eth0/queues/rx-0/rps_cpus
1001
위와 같이 넣으면 16진수로 1001은 2진수로는 다음과 같이 표현됩니다.
0001 0000 0000 0001
즉 전체 16개 CPU 중 첫번째 CPU와 13번째 CPU의 2개 CPU로 Receive packet들을 처리한다는 뜻입니다.
이렇게 구성을 해놓고 위와 동일한게 4개 port에 대해 iperf3 server/client를 구동하여 작은 size의 packet들을 30초간 보냅니다.
user607@p607-kvm1:~$ user607@p607-kvm1:~$ for i in 1 2 3 4
> do
> iperf3 -c 129.40.252.107 -P 6 -t 30 -N -l 16 -p 502${i} &
> done
그 결과를 보면, 다음과 같이 RSS를 처리하는 10번 CPU의 사용률이 대폭 떨어지고, 대신 첫번째 CPU와 13번째 CPU의 사용률이 꽤 높이, 각각 약 35% 정도로 올라간 것을 보실 수 있습니다.
그리고 RSS만 이용했을 때와 RPS까지 함께 이용했을 때의 iperf 성능 결과는 아래와 같습니다. 4개 session을 사용했기 때문에 각각의 합을 비교했습니다.
보시는 바와 같이 network 처리 성능도 약~간 상승한 것을 보실 수 있습니다. 다만 이 가상머신 환경은 16개 CPU가 있기는 하지만 실제 물리적 CPU core는 2개 밖에 없고, 각 CPU core당 8개의 SMT(hyperthread)가 있는 것이라서, CPU 자원이 워낙 작습니다. 그런 상황에서 iperf server process도 CPU를 많이 사용하다보니, 정확한 성능 측정은 어려운 상황이라는 것은 감안하셔야 합니다.
RSS와 RPS에 대한 좀더 자세한 설명은 아래 URL을 참조하시기 바랍니다.
http://balodeamit.blogspot.com/2013/10/receive-side-scaling-and-receive-packet.html
IBM POWER (ppc64le) 아키텍처에서의 RSS (Receive Side Scaling) 확인
IBM POWER 아키텍처에서도 당연히 Redhat의 RSS (Receive Side Scaling)이 지원됩니다. 이는 다음과 같이 /proc/interrupts에서 해당 NIC을 찾아봄으로써 확인하실 수 있습니다. 아래는 POWER8 Minsky 서버에서 수행한 것인데, CPU 개수가 많아서 (2-sockets * 20-cores/socket X 4-threads/core = 160개) 보기가 힘들기 때문에 여기서는 cut 명령으로 일부 column들만 display 했습니다. 아래와 같이 실제 network cable이 연결된 NIC인 enP5p1s0f0에는 1개의 transmit queue와 4개의 receive queue가 설정되어 있는 것이 보입니다. 그리고 그 queue의 interrupt 번호는 104부터 108번까지인 것도 보실 수 있습니다.
[user612@p612-met1 ~]$ egrep 'CPU|enP' /proc/interrupts | cut -c1-40,1760-1820
CPU0 CPU1 CPU2 CPU159
65: 0 0 0 0 XIVE-IRQ 2088960 Edge enP48p1s0f0
67: 0 0 0 0 XIVE-IRQ 2088962 Edge enP48p1s0f0-fp-0
68: 0 0 0 0 XIVE-IRQ 2088963 Edge enP48p1s0f0-fp-1
69: 0 0 0 0 XIVE-IRQ 2088964 Edge enP48p1s0f0-fp-2
70: 0 0 0 0 XIVE-IRQ 2088965 Edge enP48p1s0f0-fp-3
71: 0 0 0 0 XIVE-IRQ 2088966 Edge enP48p1s0f0-fp-4
76: 0 0 0 0 XIVE-IRQ 2088967 Edge enP48p1s0f0-fp-5
77: 0 0 0 0 XIVE-IRQ 2088968 Edge enP48p1s0f0-fp-6
78: 0 0 0 0 XIVE-IRQ 2088969 Edge enP48p1s0f0-fp-7
79: 0 0 0 0 XIVE-IRQ 2088970 Edge enP48p1s0f1
85: 0 0 0 0 XIVE-IRQ 2088972 Edge enP48p1s0f1-fp-0
86: 0 0 0 0 XIVE-IRQ 2088973 Edge enP48p1s0f1-fp-1
87: 0 0 0 0 XIVE-IRQ 2088974 Edge enP48p1s0f1-fp-2
94: 0 0 0 0 XIVE-IRQ 2088975 Edge enP48p1s0f1-fp-3
95: 0 0 0 3 XIVE-IRQ 2088976 Edge enP48p1s0f1-fp-4
100: 0 0 0 0 XIVE-IRQ 2088977 Edge enP48p1s0f1-fp-5
101: 0 0 0 0 XIVE-IRQ 2088978 Edge enP48p1s0f1-fp-6
102: 0 0 0 7 XIVE-IRQ 2088979 Edge enP48p1s0f1-fp-7
104: 0 0 0 0 XIVE-IRQ 1028096 Edge enP5p1s0f0-tx-0
105: 0 0 0 0 XIVE-IRQ 1028097 Edge enP5p1s0f0-rx-1
106: 0 0 0 0 XIVE-IRQ 1028098 Edge enP5p1s0f0-rx-2
107: 0 0 0 0 XIVE-IRQ 1028099 Edge enP5p1s0f0-rx-3
108: 24564 0 0 0 XIVE-IRQ 1028100 Edge enP5p1s0f0-rx-4
109: 0 0 0 0 XIVE-IRQ 1028101 Edge enP5p1s0f1-tx-0
110: 0 0 0 0 XIVE-IRQ 1028102 Edge enP5p1s0f1-rx-1
111: 0 0 0 0 XIVE-IRQ 1028103 Edge enP5p1s0f1-rx-2
112: 0 0 0 0 XIVE-IRQ 1028104 Edge enP5p1s0f1-rx-3
113: 0 0 0 0 XIVE-IRQ 1028105 Edge enP5p1s0f1-rx-4
위 정보는 아래와 같은 방법으로도 확인하실 수 있습니다. 먼저 /sys/devices 밑에서 해당 ethernet NIC을 찾습니다.
[user612@p612-met1 ~]$ sudo find /sys/devices -name "enP5p1*"
/sys/devices/pci0005:00/0005:00:00.0/0005:01:00.0/net/enP5p1s0f0
/sys/devices/pci0005:00/0005:00:00.0/0005:01:00.1/net/enP5p1s0f1
그 다음에 msi_irqs directory 속의 interrupt 번호를 확인하면 됩니다.
[user612@p612-met1 ~]$ ls -l /sys/devices/pci0005:00/0005:00:00.0/0005:01:00.0/msi_irqs
total 0
-r--r--r-- 1 root root 65536 Oct 31 20:48 104
-r--r--r-- 1 root root 65536 Oct 31 20:48 105
-r--r--r-- 1 root root 65536 Oct 31 20:48 106
-r--r--r-- 1 root root 65536 Oct 31 20:48 107
-r--r--r-- 1 root root 65536 Oct 31 20:48 108
이렇게 찾아낸 interrupt 번호로 /proc/irq/해당번호/smp_affinity를 확인해보면 아래와 같이 무의미해보이는 숫자열이 보입니다.
[user612@p612-met1 ~]$ cat /proc/irq/104/smp_affinity
00000000,00000000,00000000,00010000,00000000
[user612@p612-met1 ~]$ cat /proc/irq/105/smp_affinity
00000000,00000000,00000000,00000000,00002000
[user612@p612-met1 ~]$ cat /proc/irq/106/smp_affinity
00000000,00000000,00000000,20000000,00000000
[user612@p612-met1 ~]$ cat /proc/irq/107/smp_affinity
00000000,00000000,00000000,00000040,00000000
[user612@p612-met1 ~]$ cat /proc/irq/108/smp_affinity
00000000,00000000,00000000,00000000,00000001
위 숫자 string은 각 숫자 하나하나가 CPU 4개를 가리키는 16진수이며, 가령 /proc/irq/107/smp_affinity의 숫자열을 2진수로 풀어놓으면 다음과 같습니다. (16진수 4는 2^2이므로 2진수로는 0100 입니다)
(16진수) ..., 00000040, 00000000
(2진수) ..., 0000 0000 0000 0000 0000 0000 0100 0000, 0000 0000 0000 0000 0000 0000 0000 0000
위와 같이 2진수로 풀어쓴 숫자열의 해석은, 오른쪽부터 0 또는 1 숫자 하나하나가 CPU(정확하게는 logical CPU = hyperthread = SMT)를 가리키며 1로 표시된 것이 해당 interrupt를 처리하는 CPU입니다. 즉 오른쪽부터 39번째 CPU가 해당 interrupt를 처리하는 CPU입니다.
실제로 거기에 지정된 CPU가 해당 interrupt를 처리하는지 확인해보기 위해 iperf tool을 설치합니다.
[user612@p612-met1 ~]$ sudo yum groupinstall "Development Tools"
[user612@p612-met1 ~]$ wget https://iperf.fr/download/source/iperf-3.1.3-source.tar.gz
[user612@p612-met1 ~]$ tar -xf iperf-3.1.3-source.tar.gz
[user612@p612-met1 ~]$ cd iperf-3.1.3
[user612@p612-met1 iperf-3.1.3]$ ./configure
[user612@p612-met1 iperf-3.1.3]$ make -j8 && sudo make install
[user612@p612-met1 iperf-3.1.3]$ iperf3 -s
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
이 서버로 제 Windows PC에서 iperf를 client mode로 구동하겠습니다. (Windows에서는 관리자모드로 iperf를 수행해야 합니다.)
C:\temp\iperf-3.1.3-win64>iperf3.exe -c 129.40.252.187 -P 8
이렇게 iperf client가 접속하면 서버에서는 다음과 같은 정보가 display됩니다.
...
[ 19] 0.00-10.21 sec 0.00 Bytes 0.00 bits/sec sender
[ 19] 0.00-10.21 sec 10.1 MBytes 8.32 Mbits/sec receiver
[SUM] 0.00-10.21 sec 0.00 Bytes 0.00 bits/sec sender
[SUM] 0.00-10.21 sec 82.6 MBytes 67.9 Mbits/sec receiver
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
[user612@p612-met1 ~]$ egrep 'CPU|enP5p1s0f0' /proc/interrupts | cut -c1-40,424-450,1760-1820
CPU0 CPU1 CPU2 CPU38 CPU39 CPU159
104: 0 0 0 0 0 0 XIVE-IRQ 1028096 Edge enP5p1s0f0-tx-0
105: 0 0 0 0 0 0 XIVE-IRQ 1028097 Edge enP5p1s0f0-rx-1
106: 0 0 0 0 0 0 XIVE-IRQ 1028098 Edge enP5p1s0f0-rx-2
107: 0 0 0 44403 0 0 XIVE-IRQ 1028099 Edge enP5p1s0f0-rx-3
108: 24714 0 0 0 0 0 XIVE-IRQ 1028100 Edge enP5p1s0f0-rx-4
정말 107번 interrupt는 39번째 CPU core (CPU38)이 처리하는 것이 맞다는 것을 확인하실 수 있습니다.
WLM-CE 설치시 "failed with repodata from current_repodata.json" error에 대한 work-around
최신 버전의 Anaconda를 설치하고 거기에 포함된 conda를 이용해서 Watson Machine Learning Community Edition (WML-CE, 예전 이름 PowerAI)를 설치할 때 다음과 같이 error가 나는 경우가 있습니다.
(base) [user607@p607-kvm2 ~]$ conda config --prepend channels https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda/
(base) [user607@p607-kvm2 ~]$ conda info
active environment : base
active env location : /home/user607/anaconda3
shell level : 1
user config file : /home/user607/.condarc
populated config files : /home/user607/.condarc
conda version : 4.7.12
conda-build version : 3.18.9
python version : 3.7.4.final.0
virtual packages :
base environment : /home/user607/anaconda3 (writable)
channel URLs : https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le
https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda/noarch
https://repo.anaconda.com/pkgs/main/linux-ppc64le
https://repo.anaconda.com/pkgs/main/noarch
https://repo.anaconda.com/pkgs/r/linux-ppc64le
https://repo.anaconda.com/pkgs/r/noarch
package cache : /home/user607/anaconda3/pkgs
/home/user607/.conda/pkgs
envs directories : /home/user607/anaconda3/envs
/home/user607/.conda/envs
platform : linux-ppc64le
user-agent : conda/4.7.12 requests/2.22.0 CPython/3.7.4 Linux/4.18.0-80.el8.ppc64le rhel/8.0 glibc/2.28
UID:GID : 1000:1000
netrc file : None
offline mode : False
(base) [user607@p607-kvm2 ~]$ conda install powerai
Collecting package metadata (current_repodata.json): done
Solving environment: failed with initial frozen solve. Retrying with flexible solve.
Solving environment: failed with repodata from current_repodata.json, will retry with next repodata source.
Collecting package metadata (repodata.json): done
Solving environment: failed with initial frozen solve. Retrying with flexible solve.
Solving environment: \ failed
제 개인적인 경험으로 요약하면 아직 python 3.7 이상에서는 WLM-CE가 error를 내는 경우가 종종 있는 것 같습니다. 가장 좋은 work-around는 python 3.6.8의 virtual env를 만들어서 그것으로 사용하시는 것입니다. 다음과 같이 매우 간단하고, WLM-CE도 잘 설치됩니다.
(base) [user607@p607-kvm2 ~]$ conda create -n py368 python=3.6.8
(base) [user607@p607-kvm2 ~]$ conda activate py368
(py368) [user607@p607-kvm2 ~]$ conda install powerai
Collecting package metadata (current_repodata.json): done
Solving environment: failed with initial frozen solve. Retrying with flexible solve.
Solving environment: failed with repodata from current_repodata.json, will retry with next repodata source.
Collecting package metadata (repodata.json): done
Solving environment: done
## Package Plan ##
environment location: /home/user607/anaconda3/envs/py368
added / updated specs:
- powerai
The following packages will be downloaded:
package | build
---------------------------|-----------------
_py-xgboost-mutex-1.0 | gpu_590.g8a21f75 7 KB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
_pytorch_select-2.0 |gpu_20238.g1faf942 3 KB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
_tflow_select-2.1.0 | gpu_840.g50de12c 3 KB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
absl-py-0.7.1 | py36_0 157 KB
apex-0.1.0_1.6.2 |py36_596.g1eb5c77 1.6 MB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
asn1crypto-1.2.0 | py36_0 161 KB
astor-0.7.1 | py36_0 43 KB
atomicwrites-1.3.0 | py36_1 12 KB
attrs-19.3.0 | py_0 39 KB
bokeh-1.3.4 | py36_0 4.0 MB
boost-1.67.0 | py36_4 11 KB
c-ares-1.15.0 | h7b6447c_1001 107 KB
caffe-1.0_1.6.2 | 5184.g7b10df4 3 KB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
caffe-base-1.0_1.6.2 |gpu_py36_5184.g7b10df4 27.6 MB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
cffi-1.12.3 | py36h2e261b9_0 236 KB
chardet-3.0.4 | py36_1003 197 KB
click-7.0 | py36_0 118 KB
coverage-4.5.4 | py36h7b6447c_0 227 KB
cryptography-2.8 | py36h1ba5d50_0 579 KB
cudatoolkit-10.1.243 | 616.gc122b8b 510.3 MB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
cudnn-7.6.3_10.1 | 590.g5627c5e 472.5 MB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
cycler-0.10.0 | py36_0 13 KB
cytoolz-0.10.0 | py36h7b6447c_0 388 KB
dask-2.3.0 | py_0 12 KB
dask-core-2.3.0 | py_0 577 KB
dask-cuda-0.9.1 |py36_573.g9af8baa 25 KB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
dask-xgboost-0.1.7 |py36_579.g8a31cf5 23 KB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
ddl-1.5.0 |py36_1287.gc90c6f2 775 KB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
ddl-tensorflow-1.5.0 |py36_1007.g8dbb51d 2.4 MB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
decorator-4.4.1 | py_0 13 KB
distributed-2.3.2 | py_1 374 KB
ffmpeg-4.0 | hcdf2ecd_0 66.2 MB
freeglut-3.0.0 | hf484d3e_5 308 KB
future-0.17.1 | py36_0 698 KB
gast-0.2.2 | py36_0 138 KB
gflags-2.2.2 | 1624.g17209b3 238 KB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
glog-0.3.5 | 1613.gd054598 161 KB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
google-pasta-0.1.6 |py36_564.g04df2d9 82 KB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
graphite2-1.3.13 | h23475e2_0 109 KB
graphsurgeon-0.4.1 |py36_612.gb2bf6b9 27 KB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
grpcio-1.16.1 | py36hf8bcb03_1 1.1 MB
h5py-2.8.0 | py36h8d01980_0 962 KB
harfbuzz-1.8.8 | hffaf4a1_0 1001 KB
hypothesis-3.59.1 | py36h39e3cac_0 352 KB
idna-2.8 | py36_0 133 KB
imageio-2.6.1 | py36_0 3.4 MB
importlib_metadata-0.23 | py36_0 43 KB
jasper-2.0.14 | h07fcdf6_1 1.4 MB
joblib-0.13.2 | py36_0 365 KB
keras-applications-1.0.8 | py_0 33 KB
keras-preprocessing-1.1.0 | py_1 36 KB
kiwisolver-1.1.0 | py36he6710b0_0 101 KB
leveldb-1.20 | hf484d3e_1 394 KB
libboost-1.67.0 | h46d08c1_4 22.1 MB
libglu-9.0.0 | hf484d3e_1 635 KB
libopencv-3.4.7 | 725.g92aa195 17.1 MB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
libopus-1.3 | h7b6447c_0 832 KB
libprotobuf-3.8.0 | 577.g45759bb 6.6 MB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
libvpx-1.7.0 | hf484d3e_0 2.6 MB
libxgboost-base-0.90 | gpu_590.g8a21f75 168.4 MB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
llvmlite-0.29.0 | py36hd408876_0 16.6 MB
lmdb-0.9.22 | hf484d3e_1 926 KB
locket-0.2.0 | py36_1 8 KB
markdown-3.1.1 | py36_0 113 KB
markupsafe-1.1.1 | py36h7b6447c_0 30 KB
matplotlib-3.1.1 | py36h5429711_0 6.7 MB
mock-2.0.0 | py36_0 104 KB
more-itertools-7.2.0 | py36_0 99 KB
msgpack-python-0.6.1 | py36hfd86e86_1 95 KB
nccl-2.4.8 | 586.gdba67b7 137.4 MB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
networkx-2.2 | py36_1 2.0 MB
ninja-1.9.0 | py36hfd86e86_0 1.9 MB
numactl-2.0.12 | 573.gdf5dc62 139 KB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
numba-0.45.1 | py36h962f231_0 3.2 MB
numpy-1.16.5 | py36h99e49ec_0 49 KB
numpy-base-1.16.5 | py36h2f8d375_0 4.5 MB
olefile-0.46 | py36_0 48 KB
onnx-1.5.0 |py36_614.gd049fd7 2.9 MB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
opencv-3.4.7 |py36_725.g92aa195 4 KB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
pai4sk-1.5.0 |py36_1067.gc6c35a2 7.6 MB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
pandas-0.25.2 | py36he6710b0_0 10.7 MB
pbr-5.4.3 | py_0 78 KB
pciutils-3.6.2 | 571.g2316d13 324 KB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
pillow-6.2.0 | py36h0d2faf8_0 693 KB
pluggy-0.13.0 | py36_0 31 KB
powerai-1.6.2 | 615.g1dade79 3 KB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
powerai-license-1.6.2 | 716.g7081e12 6.4 MB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
powerai-release-1.6.2 | 572.gb216c2c 3 KB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
powerai-tools-1.6.2 | 565.g97f2c3f 7 KB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
protobuf-3.8.0 |py36_587.gab45ad3 699 KB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
psutil-5.5.0 | py36h7b6447c_0 317 KB
py-1.8.0 | py36_0 140 KB
py-boost-1.67.0 | py36h04863e7_4 358 KB
py-opencv-3.4.7 |py36_725.g92aa195 1.5 MB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
py-xgboost-base-0.90 |gpu_py36_590.g8a21f75 84.7 MB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
py-xgboost-gpu-0.90 | 590.g8a21f75 3 KB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
pycparser-2.19 | py36_0 173 KB
pyopenssl-19.0.0 | py36_0 81 KB
pysocks-1.7.1 | py36_0 30 KB
pytest-4.4.2 | py36_0 358 KB
python-dateutil-2.8.0 | py36_0 281 KB
python-lmdb-0.94 | py36h14c3975_0 142 KB
pytorch-1.2.0 | 20238.g1faf942 3 KB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
pytorch-base-1.2.0 |gpu_py36_20238.g1faf942 517.1 MB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
pywavelets-1.1.1 | py36h7b6447c_0 4.4 MB
pyyaml-5.1.2 | py36h7b6447c_0 174 KB
requests-2.22.0 | py36_0 89 KB
scikit-image-0.15.0 | py36he6710b0_0 28.2 MB
scikit-learn-0.21.3 | py36h22eb022_0 4.6 MB
scipy-1.3.0 | py36he2b7bc3_0 19.3 MB
simsearch-1.1.0 |py36_764.g7c5f6cf 26.0 MB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
six-1.12.0 | py36_0 22 KB
snapml-spark-1.4.0 |py36_942.gc873569 1.6 MB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
sortedcontainers-2.1.0 | py36_0 45 KB
spectrum-mpi-10.03 | 622.gfc88b70 22.3 MB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
tabulate-0.8.2 | py36_0 36 KB
tbb-2019.8 | hfd86e86_0 998 KB
tensorboard-1.15.0 |py36_3634.g50de12c 3.8 MB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
tensorflow-1.15.0 |gpu_py36_841.g50de12c 4 KB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
tensorflow-base-1.15.0 |gpu_py36_590d6ee_64210.g4a039ec 571.9 MB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
tensorflow-estimator-1.15.1|py36_a5f60ce_1351.g50de12c 665 KB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
tensorflow-gpu-1.15.0 | 841.g50de12c 3 KB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
tensorflow-large-model-support-2.0.2|py36_970.gfa57a9e 60 KB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
tensorflow-probability-0.8.0|py36_b959b26_2686.g50de12c 2.1 MB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
tensorflow-serving-api-1.15.0|py36_748217e_5094.g89559ef 36 KB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
tensorrt-6.0.1.5 |py36_612.gb2bf6b9 437.3 MB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
termcolor-1.1.0 | py36_1 7 KB
tf_cnn_benchmarks-1.15 |gpu_py36_1374.g5e94b18 189 KB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
torchtext-0.4.0 |py36_578.g5bf3960 1.1 MB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
torchvision-base-0.4.0 |gpu_py36_593.g80f339d 3.0 MB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
tornado-6.0.3 | py36h7b6447c_0 642 KB
tqdm-4.32.1 | py_0 48 KB
typing-3.6.4 | py36_0 44 KB
uff-0.6.5 |py36_612.gb2bf6b9 79 KB https://public.dhe.ibm.com/ibmdl/export/pub/software/server/ibm-ai/conda
urllib3-1.24.2 | py36_0 152 KB
werkzeug-0.15.4 | py_0 262 KB
wrapt-1.11.2 | py36h7b6447c_0 48 KB
------------------------------------------------------------
Total: 3.18 GB
The following NEW packages will be INSTALLED:
_py-xgboost-mutex ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::_py-xgboost-mutex-1.0-gpu_590.g8a21f75
_pytorch_select ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::_pytorch_select-2.0-gpu_20238.g1faf942
_tflow_select ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::_tflow_select-2.1.0-gpu_840.g50de12c
absl-py pkgs/main/linux-ppc64le::absl-py-0.7.1-py36_0
apex ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::apex-0.1.0_1.6.2-py36_596.g1eb5c77
asn1crypto pkgs/main/linux-ppc64le::asn1crypto-1.2.0-py36_0
astor pkgs/main/linux-ppc64le::astor-0.7.1-py36_0
atomicwrites pkgs/main/linux-ppc64le::atomicwrites-1.3.0-py36_1
attrs pkgs/main/noarch::attrs-19.3.0-py_0
blas pkgs/main/linux-ppc64le::blas-1.0-openblas
bokeh pkgs/main/linux-ppc64le::bokeh-1.3.4-py36_0
boost pkgs/main/linux-ppc64le::boost-1.67.0-py36_4
bzip2 pkgs/main/linux-ppc64le::bzip2-1.0.8-h7b6447c_0
c-ares pkgs/main/linux-ppc64le::c-ares-1.15.0-h7b6447c_1001
caffe ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::caffe-1.0_1.6.2-5184.g7b10df4
caffe-base ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::caffe-base-1.0_1.6.2-gpu_py36_5184.g7b10df4
cairo pkgs/main/linux-ppc64le::cairo-1.14.12-h8948797_3
cffi pkgs/main/linux-ppc64le::cffi-1.12.3-py36h2e261b9_0
chardet pkgs/main/linux-ppc64le::chardet-3.0.4-py36_1003
click pkgs/main/linux-ppc64le::click-7.0-py36_0
cloudpickle pkgs/main/noarch::cloudpickle-1.2.2-py_0
coverage pkgs/main/linux-ppc64le::coverage-4.5.4-py36h7b6447c_0
cryptography pkgs/main/linux-ppc64le::cryptography-2.8-py36h1ba5d50_0
cudatoolkit ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::cudatoolkit-10.1.243-616.gc122b8b
cudnn ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::cudnn-7.6.3_10.1-590.g5627c5e
cycler pkgs/main/linux-ppc64le::cycler-0.10.0-py36_0
cytoolz pkgs/main/linux-ppc64le::cytoolz-0.10.0-py36h7b6447c_0
dask pkgs/main/noarch::dask-2.3.0-py_0
dask-core pkgs/main/noarch::dask-core-2.3.0-py_0
dask-cuda ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::dask-cuda-0.9.1-py36_573.g9af8baa
dask-xgboost ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::dask-xgboost-0.1.7-py36_579.g8a31cf5
ddl ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::ddl-1.5.0-py36_1287.gc90c6f2
ddl-tensorflow ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::ddl-tensorflow-1.5.0-py36_1007.g8dbb51d
decorator pkgs/main/noarch::decorator-4.4.1-py_0
distributed pkgs/main/noarch::distributed-2.3.2-py_1
ffmpeg pkgs/main/linux-ppc64le::ffmpeg-4.0-hcdf2ecd_0
fontconfig pkgs/main/linux-ppc64le::fontconfig-2.13.0-h9420a91_0
freeglut pkgs/main/linux-ppc64le::freeglut-3.0.0-hf484d3e_5
freetype pkgs/main/linux-ppc64le::freetype-2.9.1-h8a8886c_0
fsspec pkgs/main/noarch::fsspec-0.5.2-py_0
future pkgs/main/linux-ppc64le::future-0.17.1-py36_0
gast pkgs/main/linux-ppc64le::gast-0.2.2-py36_0
gflags ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::gflags-2.2.2-1624.g17209b3
glib pkgs/main/linux-ppc64le::glib-2.56.2-hd408876_0
glog ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::glog-0.3.5-1613.gd054598
google-pasta ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::google-pasta-0.1.6-py36_564.g04df2d9
graphite2 pkgs/main/linux-ppc64le::graphite2-1.3.13-h23475e2_0
graphsurgeon ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::graphsurgeon-0.4.1-py36_612.gb2bf6b9
grpcio pkgs/main/linux-ppc64le::grpcio-1.16.1-py36hf8bcb03_1
h5py pkgs/main/linux-ppc64le::h5py-2.8.0-py36h8d01980_0
harfbuzz pkgs/main/linux-ppc64le::harfbuzz-1.8.8-hffaf4a1_0
hdf5 pkgs/main/linux-ppc64le::hdf5-1.10.2-hba1933b_1
heapdict pkgs/main/noarch::heapdict-1.0.1-py_0
hypothesis pkgs/main/linux-ppc64le::hypothesis-3.59.1-py36h39e3cac_0
icu pkgs/main/linux-ppc64le::icu-58.2-h64fc554_1
idna pkgs/main/linux-ppc64le::idna-2.8-py36_0
imageio pkgs/main/linux-ppc64le::imageio-2.6.1-py36_0
importlib_metadata pkgs/main/linux-ppc64le::importlib_metadata-0.23-py36_0
jasper pkgs/main/linux-ppc64le::jasper-2.0.14-h07fcdf6_1
jinja2 pkgs/main/noarch::jinja2-2.10.3-py_0
joblib pkgs/main/linux-ppc64le::joblib-0.13.2-py36_0
jpeg pkgs/main/linux-ppc64le::jpeg-9b-hcb7ba68_2
keras-applications pkgs/main/noarch::keras-applications-1.0.8-py_0
keras-preprocessi~ pkgs/main/noarch::keras-preprocessing-1.1.0-py_1
kiwisolver pkgs/main/linux-ppc64le::kiwisolver-1.1.0-py36he6710b0_0
leveldb pkgs/main/linux-ppc64le::leveldb-1.20-hf484d3e_1
libboost pkgs/main/linux-ppc64le::libboost-1.67.0-h46d08c1_4
libgfortran-ng pkgs/main/linux-ppc64le::libgfortran-ng-7.3.0-h822a55f_1
libglu pkgs/main/linux-ppc64le::libglu-9.0.0-hf484d3e_1
libopenblas pkgs/main/linux-ppc64le::libopenblas-0.3.6-h5a2b251_1
libopencv ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::libopencv-3.4.7-725.g92aa195
libopus pkgs/main/linux-ppc64le::libopus-1.3-h7b6447c_0
libpng pkgs/main/linux-ppc64le::libpng-1.6.37-hbc83047_0
libprotobuf ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::libprotobuf-3.8.0-577.g45759bb
libtiff pkgs/main/linux-ppc64le::libtiff-4.0.10-h2733197_2
libuuid pkgs/main/linux-ppc64le::libuuid-1.0.3-h1bed415_2
libvpx pkgs/main/linux-ppc64le::libvpx-1.7.0-hf484d3e_0
libxcb pkgs/main/linux-ppc64le::libxcb-1.13-h1bed415_0
libxgboost-base ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::libxgboost-base-0.90-gpu_590.g8a21f75
libxml2 pkgs/main/linux-ppc64le::libxml2-2.9.9-hea5a465_1
llvmlite pkgs/main/linux-ppc64le::llvmlite-0.29.0-py36hd408876_0
lmdb pkgs/main/linux-ppc64le::lmdb-0.9.22-hf484d3e_1
locket pkgs/main/linux-ppc64le::locket-0.2.0-py36_1
markdown pkgs/main/linux-ppc64le::markdown-3.1.1-py36_0
markupsafe pkgs/main/linux-ppc64le::markupsafe-1.1.1-py36h7b6447c_0
matplotlib pkgs/main/linux-ppc64le::matplotlib-3.1.1-py36h5429711_0
mock pkgs/main/linux-ppc64le::mock-2.0.0-py36_0
more-itertools pkgs/main/linux-ppc64le::more-itertools-7.2.0-py36_0
msgpack-python pkgs/main/linux-ppc64le::msgpack-python-0.6.1-py36hfd86e86_1
nccl ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::nccl-2.4.8-586.gdba67b7
networkx pkgs/main/linux-ppc64le::networkx-2.2-py36_1
ninja pkgs/main/linux-ppc64le::ninja-1.9.0-py36hfd86e86_0
nomkl pkgs/main/linux-ppc64le::nomkl-3.0-0
numactl ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::numactl-2.0.12-573.gdf5dc62
numba pkgs/main/linux-ppc64le::numba-0.45.1-py36h962f231_0
numpy pkgs/main/linux-ppc64le::numpy-1.16.5-py36h99e49ec_0
numpy-base pkgs/main/linux-ppc64le::numpy-base-1.16.5-py36h2f8d375_0
olefile pkgs/main/linux-ppc64le::olefile-0.46-py36_0
onnx ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::onnx-1.5.0-py36_614.gd049fd7
openblas pkgs/main/linux-ppc64le::openblas-0.3.6-1
openblas-devel pkgs/main/linux-ppc64le::openblas-devel-0.3.6-1
opencv ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::opencv-3.4.7-py36_725.g92aa195
packaging pkgs/main/noarch::packaging-19.2-py_0
pai4sk ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::pai4sk-1.5.0-py36_1067.gc6c35a2
pandas pkgs/main/linux-ppc64le::pandas-0.25.2-py36he6710b0_0
partd pkgs/main/noarch::partd-1.0.0-py_0
pbr pkgs/main/noarch::pbr-5.4.3-py_0
pciutils ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::pciutils-3.6.2-571.g2316d13
pcre pkgs/main/linux-ppc64le::pcre-8.43-he6710b0_0
pillow pkgs/main/linux-ppc64le::pillow-6.2.0-py36h0d2faf8_0
pixman pkgs/main/linux-ppc64le::pixman-0.34.0-h1f8d8dc_3
pluggy pkgs/main/linux-ppc64le::pluggy-0.13.0-py36_0
powerai ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::powerai-1.6.2-615.g1dade79
powerai-license ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::powerai-license-1.6.2-716.g7081e12
powerai-release ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::powerai-release-1.6.2-572.gb216c2c
powerai-tools ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::powerai-tools-1.6.2-565.g97f2c3f
protobuf ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::protobuf-3.8.0-py36_587.gab45ad3
psutil pkgs/main/linux-ppc64le::psutil-5.5.0-py36h7b6447c_0
py pkgs/main/linux-ppc64le::py-1.8.0-py36_0
py-boost pkgs/main/linux-ppc64le::py-boost-1.67.0-py36h04863e7_4
py-opencv ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::py-opencv-3.4.7-py36_725.g92aa195
py-xgboost-base ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::py-xgboost-base-0.90-gpu_py36_590.g8a21f75
py-xgboost-gpu ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::py-xgboost-gpu-0.90-590.g8a21f75
pycparser pkgs/main/linux-ppc64le::pycparser-2.19-py36_0
pyopenssl pkgs/main/linux-ppc64le::pyopenssl-19.0.0-py36_0
pyparsing pkgs/main/noarch::pyparsing-2.4.2-py_0
pysocks pkgs/main/linux-ppc64le::pysocks-1.7.1-py36_0
pytest pkgs/main/linux-ppc64le::pytest-4.4.2-py36_0
python-dateutil pkgs/main/linux-ppc64le::python-dateutil-2.8.0-py36_0
python-lmdb pkgs/main/linux-ppc64le::python-lmdb-0.94-py36h14c3975_0
pytorch ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::pytorch-1.2.0-20238.g1faf942
pytorch-base ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::pytorch-base-1.2.0-gpu_py36_20238.g1faf942
pytz pkgs/main/noarch::pytz-2019.3-py_0
pywavelets pkgs/main/linux-ppc64le::pywavelets-1.1.1-py36h7b6447c_0
pyyaml pkgs/main/linux-ppc64le::pyyaml-5.1.2-py36h7b6447c_0
requests pkgs/main/linux-ppc64le::requests-2.22.0-py36_0
scikit-image pkgs/main/linux-ppc64le::scikit-image-0.15.0-py36he6710b0_0
scikit-learn pkgs/main/linux-ppc64le::scikit-learn-0.21.3-py36h22eb022_0
scipy pkgs/main/linux-ppc64le::scipy-1.3.0-py36he2b7bc3_0
simsearch ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::simsearch-1.1.0-py36_764.g7c5f6cf
six pkgs/main/linux-ppc64le::six-1.12.0-py36_0
snapml-spark ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::snapml-spark-1.4.0-py36_942.gc873569
snappy pkgs/main/linux-ppc64le::snappy-1.1.7-h1532aa0_3
sortedcontainers pkgs/main/linux-ppc64le::sortedcontainers-2.1.0-py36_0
spectrum-mpi ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::spectrum-mpi-10.03-622.gfc88b70
tabulate pkgs/main/linux-ppc64le::tabulate-0.8.2-py36_0
tbb pkgs/main/linux-ppc64le::tbb-2019.8-hfd86e86_0
tblib pkgs/main/noarch::tblib-1.4.0-py_0
tensorboard ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::tensorboard-1.15.0-py36_3634.g50de12c
tensorflow ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::tensorflow-1.15.0-gpu_py36_841.g50de12c
tensorflow-base ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::tensorflow-base-1.15.0-gpu_py36_590d6ee_64210.g4a039ec
tensorflow-estima~ ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::tensorflow-estimator-1.15.1-py36_a5f60ce_1351.g50de12c
tensorflow-gpu ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::tensorflow-gpu-1.15.0-841.g50de12c
tensorflow-large-~ ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::tensorflow-large-model-support-2.0.2-py36_970.gfa57a9e
tensorflow-probab~ ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::tensorflow-probability-0.8.0-py36_b959b26_2686.g50de12c
tensorflow-servin~ ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::tensorflow-serving-api-1.15.0-py36_748217e_5094.g89559ef
tensorrt ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::tensorrt-6.0.1.5-py36_612.gb2bf6b9
termcolor pkgs/main/linux-ppc64le::termcolor-1.1.0-py36_1
tf_cnn_benchmarks ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::tf_cnn_benchmarks-1.15-gpu_py36_1374.g5e94b18
toolz pkgs/main/noarch::toolz-0.10.0-py_0
torchtext ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::torchtext-0.4.0-py36_578.g5bf3960
torchvision-base ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::torchvision-base-0.4.0-gpu_py36_593.g80f339d
tornado pkgs/main/linux-ppc64le::tornado-6.0.3-py36h7b6447c_0
tqdm pkgs/main/noarch::tqdm-4.32.1-py_0
typing pkgs/main/linux-ppc64le::typing-3.6.4-py36_0
uff ibmdl/export/pub/software/server/ibm-ai/conda/linux-ppc64le::uff-0.6.5-py36_612.gb2bf6b9
urllib3 pkgs/main/linux-ppc64le::urllib3-1.24.2-py36_0
werkzeug pkgs/main/noarch::werkzeug-0.15.4-py_0
wrapt pkgs/main/linux-ppc64le::wrapt-1.11.2-py36h7b6447c_0
yaml pkgs/main/linux-ppc64le::yaml-0.1.7-h1bed415_2
zict pkgs/main/noarch::zict-1.0.0-py_0
zipp pkgs/main/noarch::zipp-0.6.0-py_0
zstd pkgs/main/linux-ppc64le::zstd-1.3.7-h0b5b093_0
Proceed ([y]/n)? y
...
2019년 10월 30일 수요일
H2O Driverless AI에서 HDFS로부터 dataset을 import 하기
H2O DAI에서 HDFS에 있는 파일을 직접 가져와야 하는 경우가 있습니다. 대부분의 경우 hadoop cluster의 data node들은 x86 아키텍처인 경우가 많은데, ppc64le 아키텍처인 IBM AC922 서버에서도 hadoop binary를 풀어놓기만 하면 쉽게 x86 아키텍처의 hadoop cluster에서 data를 끌어올 수 있습니다. 굳이 HDFS 속에 든 data file을 AC922 서버의 local filesystem(즉 POSIX filesystem)으로 copy해서 가져올 필요없이, H2O DAI의 web interface에서 직접 import 해올 수 있습니다.
이를 테스트해보기 위해 일단 다음과 같이 ppc64le 서버에 hadoop binary를 설치합니다. 여기서는 전에 올렸던 포스팅(http://hwengineer.blogspot.com/2019/01/ppc64le-redhat-x86-hadoop-cluster-hive.html)에서 빌드했던 ppc64le용 hadoop 2.6.5 binary를 사용하겠습니다.
[user654@p654-kvm1 ~]$ tar -xvf hadoop-2.6.5.tar.gz
[user654@p654-kvm1 ~]$ cd hadoop-2.6.5/etc/hadoop
다음과 같이 core-site.xml와 mapred-site.xml 등 일부 config 파일을 간단히 수정하여 이 서버를 hadoop name node이자 data node로 구성하겠습니다.
[user654@p654-kvm1 hadoop]$ vi mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
<property>
<name>mapred.local.dir</name>
<value>${hadoop.tmp.dir}/mapred/local</value>
</property>
<property>
<name>mapred.system.dir</name>
<value>${hadoop.tmp.dir}/mapred/system</value>
</property>
</configuration>
[user654@p654-kvm1 hadoop]$ vi core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/user654/hadoop-2.6.5/hadoop-${user.name}</value>
</property>
</configuration>
[user654@p654-kvm1 hadoop]$ vi slaves
localhost
[user654@p654-kvm1 hadoop]$ cd ../..
이제 HDFS를 format 합니다.
[user654@p654-kvm1 hadoop-2.6.5]$ hadoop namenode -format
이어서 hadoop cluster를 시작합니다.
[user654@p654-kvm1 hadoop-2.6.5]$ . sbin/start-all.sh
OS user name인 user654의 home directory를 HDFS 내에 만듭니다.
[user654@p654-kvm1 ~]$ hadoop fs -mkdir -p /user/user654
이제 HDFS 내에 input이라는 directory를 만들고 거기에 OS의 filesystem에 들어있는 BlackFriday_train.xls 라는 file을 HDFS에 넣어줍니다.
[user654@p654-kvm1 ~]$ hadoop fs -mkdir input
[user654@p654-kvm1 ~]$ hadoop fs -put ./BlackFriday_train.xls input
다음과 같이 잘 들어간 것을 확인합니다.
[user654@p654-kvm1 ~]$ hadoop fs -ls -R
drwxr-xr-x - user654 supergroup 0 2019-10-30 02:10 input
-rw-r--r-- 3 user654 supergroup 10181120 2019-10-30 02:10 input/BlackFriday_train.xls
이제 H2O DAI의 구성 파일인 config.toml을 수정합니다. 고쳐야 할 부분은 core_site_xml_path과 hdfs_config_path에 hadoop config file들의 PATH를 명기하는 것 뿐입니다.
[user654@p654-kvm1 dai-1.8.0-linux-ppc64le]$ vi config.toml
...
core_site_xml_path = "/home/user654/hadoop-2.6.5/etc/hadoop"
...
hdfs_config_path = "/home/user654/hadoop-2.6.5/etc/hadoop"
...
이제 H2O DAI를 restart 합니다.
[user654@p654-kvm1 dai-1.8.0-linux-ppc64le]$ ./kill-dai.sh
[user654@p654-kvm1 dai-1.8.0-linux-ppc64le]$ ./run-dai.sh
그런 뒤에 Add Dataset 메뉴에 가서 HDFS를 선택합니다. 들어가보면 "Explore Hadoop File System"이라는 메뉴가 나옵니다. 이때 이 메뉴 제목 바로 아래의 hdfs:// 뒤에 다음과 같이 어느 hadoop node에 접근해야 하는지 이름은 손으로 타이핑해서 적어줘야 합니다. 여기서는 localhost:9000/ 까지 손으로 적어줍니다. 이후에는 directory 이름을 click 하여 원하는 파일을 HDFS에서 찾아낼 수 있습니다.
hdfs://localhost:9000/
다음과 같이 잘 import 되는 것을 보실 수 있습니다.
2019년 10월 21일 월요일
2019년 10월 10일 목요일
SRILM을 IBM POWER (ppc64le) 아키텍처의 Redhat에서 build하기
SRILM은 음성인식 등에 쓰이는 statistical language model(LM)들을 쉽게 구축하고 적용할 수 있는 toolkit입니다. 이것을 IBM POWER 서버에 설치된 Redhat이나 Ubuntu 등 linux OS에서도 build해서 사용할 수 있느냐에 대한 답변은 "Yes, 된다" 입니다.
SRILM의 현재 최신버전인 1.7.3 버전에서는 ppc64 (big-endian) 만 지원하는 것처럼 되어 있습니다만, 이는 그냥 ppc64le가 template에 아직 update가 안되었을 뿐이며, template만 약간 수정하면 ppc64le (little-endian)에서도 쉽게 build 하실 수 있습니다.
먼저, 필요 OS fileset들을 설치합니다. 여기서는 Redhat 7.5를 기준으로 했습니다.
[user612@p612-met1 ~]$ sudo yum install -y gawk tcl-devel libticonv-devel bzip2
SRILM의 최신 버전 1.7.3을 아래 URL에서 download 받고, POWER 서버에 upload 합니다.
http://www.speech.sri.com/projects/srilm/download.html
압축을 해제합니다.
[user612@p612-met1 ~]$ mkdir srilm
[user612@p612-met1 ~]$ cd srilm
[user612@p612-met1 srilm]$ tar -xvf ../srilm-1.7.3.tar.gz
먼저 source에 포함된 machine-type 이라는 shell script를 수행해보면 MACHINE_TYPE을 못 찾겠다는 error가 납니다. 이는 아래와 같이 shell script를 약간만 수정하면 해결됩니다.
[user612@p612-met1 srilm]$ ./sbin/machine-type
could not determine MACHINE_TYPE
[user612@p612-met1 srilm]$ vi ./sbin/machine-type
...
*)
case "`uname -m`" in
ppc64) MACHINE_TYPE=ppc64
;;
ppc64le) MACHINE_TYPE=ppc64le # Newly added
;; # Newly added
i686) MACHINE_TYPE=i686
;;
이제 잘 됩니다.
[user612@p612-met1 srilm]$ ./sbin/machine-type
ppc64le
이어서 Makefile에서 SRILM home directory를 update 합니다. 사실 이건 ppc64le 아키텍처에서만 수정해야 하는 것이 아니라 x86 등 모든 아키텍처에서 다 환경에 맞게 수정해야 하는 부분입니다.
[user612@p612-met1 srilm]$ vi Makefile
...
# SRILM = /home/speech/stolcke/project/srilm/devel
SRILM = /home/user612/srilm # Update per environment
ppc64le 아키텍처가 지원 안되는 것처럼 보이는 것은 아래의 common/Makefile.machine.* 파일들에 ppc64만 있고 ppc64le가 없기 때문입니다. 그냥 기존의 ppc64를 ppc64le로 copy해줍니다.
[user612@p612-met1 srilm]$ cp common/Makefile.machine.ppc64 common/Makefile.machine.ppc64le
그리고 여기서 LINK할 library에 pthread를 추가해줍니다. (이를 안 해주면 어떤 error가 나는지는 맨 아래에 적었습니다.)
[user612@p612-met1 srilm]$ vi common/Makefile.machine.ppc64le
...
# ADDITIONAL_LIBRARIES = -lm -ldl
ADDITIONAL_LIBRARIES = -lm -ldl -lpthread # Added -lpthread
...
이제 그냥 make를 수행하시면 됩니다. 아무 error 없이 잘 build 됩니다.
[user612@p612-met1 srilm]$ make -j16
이제 PATH를 잡아주고 ngram 명령을 수행해봅니다. 아래와 같이 잘 수행되는 것을 보실 수 있습니다.
[user612@p612-met1 srilm]$ pwd
/home/user612/srilm
[user612@p612-met1 srilm]$ export PATH=$PATH:/home/user612/srilm/bin/ppc64le
[user612@p612-met1 srilm]$ ngram -help
Usage of command "ngram"
-version: print version information
-order: max ngram order
Default value: 3
-debug: debugging level for lm
Default value: 0
-skipoovs: skip n-gram contexts containing OOVs
...
** 만약 위에서 common/Makefile.machine.ppc64le 속의 "ADDITIONAL_LIBRARIES = -lm -ldl -lpthread" 부분을 고치지 않는다면 다음과 같은 error를 겪게 되실 것입니다. 이 error가 나는 이유는 /usr/lib64/libpthread.so.0 가 참조되지 않기 때문이니, 위와 같이 common/Makefile.machine.ppc64le을 수정하시면 해결됩니다.
...
g++ -Wreturn-type -Wimplicit -DINSTANTIATE_TEMPLATES -I. -I../../include -u matherr -L../../lib/ppc64le -g -O3 -o ../bin/ppc64le/ngram-merge ../obj/ppc64le/ngram-merge.o ../obj/ppc64le/liboolm.a -lm -ldl ../../lib/ppc64le/libflm.a ../../lib/ppc64le/libdstruct.a ../../lib/ppc64le/libmisc.a ../../lib/ppc64le/libz.a -ltcl -lm 2>&1 | c++filt
/usr/bin/ld: ../obj/ppc64le/liboolm.a(Vocab.o): undefined reference to symbol 'pthread_getspecific@@GLIBC_2.17'
//usr/lib64/libpthread.so.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
test -f ../bin/ppc64le/ngram-merge
make[2]: *** [../bin/ppc64le/ngram-merge] Error 1
make[2]: *** Waiting for unfinished jobs....
make[2]: Leaving directory `/home/user612/srilm/lm/src'
make[1]: *** [release-programs] Error 1
make[1]: Leaving directory `/home/user612/srilm'
make: *** [World] Error 2
H2O DriverlessAI 에서의 custom recipe 등록하는 방법
H2O DriverlessAI (이하 H2O DAI) 버전 1.7 이상에서는 custom recipe를 등록해서 사용할 수 있는 기능, 즉 BYOR(Bring Your Own Recipe) 기능을 사용하실 수 있습니다. 이 recipe라는 것은 결국 python code인데, 자신만의 recipe를 어떤 format으로 어떻게 coding해야 하는지에 대해서는 다음의 github에 예제가 있으므로 참조하시기 바랍니다.
https://github.com/h2oai/driverlessai-recipes/
그렇게 recipe code를 작성하고 난 뒤에 어떻게 H2O DAI에 등록을 하느냐에 대해서 아래에 그림과 함께 정리했습니다.
우선은 custom recipe code를 새로 등록하기 전에, 기존의 recipe들에는 무엇이 있었는지 확인하겠습니다.
먼저 dataset을 선택해서 평소처럼 'Predict' 메뉴에 들어갑니다. 거기서 평소와는 달리 'EXPERT SETTINGS' 부분을 click 합니다.
그렇게 들어간 메뉴 오른쪽 상단에 'RECIPE' tab이 보입니다. 그걸 click 하십시요.
아래 그림과 같이 'Include specific models' 부분의 'SELECT VALUES' button을 click 하십시요.
그 결과를 보면 다음과 같습니다. 기본적으로 9개의 recipe가 이미 등록되어 있는 것을 보실 수 있습니다. 나중에 custom recipe를 등록한 뒤에 이 화면과 비교해보시면 됩니다.
이제 custome recipe code를 등록하겠습니다. 여기서는 여러분의 PC에 custom recipe를 위한 python code가 저장되어 있다고 가정하겠습니다. 'EXPERT SETTINGS' 메뉴의 맨 왼쪽 상단에 있는 '+ UPLOAD CUSTOM RECIPE' button을 click 하십시요.
그러면 upload할 code를 선택하기 위한 box가 나타납니다. 여기서 제가 upload할 code는 아래 github에서 가져온 것입니다.
https://github.com/h2oai/driverlessai-recipes/blob/master/models/algorithms/h2o-3-models.py
그 code를 선택하여 click 하시면 문법 등의 검증 과정을 거쳐 H2O DAI가 available한 recipe로 등록합니다.
이제 사실상 끝난 것입니다. 확인을 위해 아까 위에서 했던 것처럼 아래 그림과 같이 'Include specific models' 부분의 'SELECT VALUES' button을 click 하십시요.
이제 새로 upload된 python code 안의 custom model들이 새로 등록된 것을 보실 수 있습니다.
Default로는 모든 custom recipe도 enable되어 있습니다. 올리신 custom recipe들을 적용하고 싶지 않을 때는 오른쪽 상단의 'Disable/Enable Custom' toggle button을 클릭하시면 됩니다.
올리신 custom recipe를 제거하고 싶으시면 H2O DAI의 설치 direcoty 밑의 ./tmp/contrib/ 밑의 아래 내용들을 지우시면 됩니다. 그러신 뒤에 H2O DAI를 restart 하셔야 합니다.
$ pwd
/home/user612/dai-1.7.1-linux-ppc64le/tmp/contrib
$ rm -rf models_global_packages/* transformers_global_packages/* models/*
피드 구독하기:
글 (Atom)