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월 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/*