Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기Ki-Hwan Kim
PYCON Korea 2015
Python은 과학 계산 분야에서도 이미 널리 사용되고 있습니다. numpy와 scipy 기반으로 만들어진 많은 모듈들이 휼륭한 생태계를 이루고 있기 때문입니다. 그러나 극한의 계산 성능을 요구하는 분야(HPC, High Performance Computing)에서는 여전히 C와 Fortran으로만으로 짜여진 코드들이 선호되고 있습니다. 이런 분야에서 Python에 대한 일반적인 견해는 전처리/후처리에는 유용하지만 메인 코드에 적용하기에는 느리다라는 것입니다.
이번 발표에서는 HPC 분야에서도 Python의 유용함을 보여줍니다. 계산이 집중된 부분만을 Fortran, C로 구현하여 Python 메인 코드에 접합하면, Python의 장점은 충분히 활용하면서도 계산 성능에 큰 손해는 보지 않을 수 있습니다. 게다가 CUDA-C, OpenCL-C와 연동하면 GPU, MIC와 같은 가속 프로세서들도 비교적 쉽게 활용할 수 있습니다. 이번 발표에서는 간단한 시뮬레이션 코드를 예제로 사용하여 Python 코드로부터 시작하여 Fortran, C, CUDA-C, OpenCL-C 등을 단계적으로 접합해 나가는 것을 보여줄 것입니다.
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기Ki-Hwan Kim
PYCON Korea 2015
Python은 과학 계산 분야에서도 이미 널리 사용되고 있습니다. numpy와 scipy 기반으로 만들어진 많은 모듈들이 휼륭한 생태계를 이루고 있기 때문입니다. 그러나 극한의 계산 성능을 요구하는 분야(HPC, High Performance Computing)에서는 여전히 C와 Fortran으로만으로 짜여진 코드들이 선호되고 있습니다. 이런 분야에서 Python에 대한 일반적인 견해는 전처리/후처리에는 유용하지만 메인 코드에 적용하기에는 느리다라는 것입니다.
이번 발표에서는 HPC 분야에서도 Python의 유용함을 보여줍니다. 계산이 집중된 부분만을 Fortran, C로 구현하여 Python 메인 코드에 접합하면, Python의 장점은 충분히 활용하면서도 계산 성능에 큰 손해는 보지 않을 수 있습니다. 게다가 CUDA-C, OpenCL-C와 연동하면 GPU, MIC와 같은 가속 프로세서들도 비교적 쉽게 활용할 수 있습니다. 이번 발표에서는 간단한 시뮬레이션 코드를 예제로 사용하여 Python 코드로부터 시작하여 Fortran, C, CUDA-C, OpenCL-C 등을 단계적으로 접합해 나가는 것을 보여줄 것입니다.
[2014 CodeEngn Conference 11] 이경식 - 동적 추적 프레임워크를 이용한 OS X 바이너리 분석GangSeok Lee
2014 CodeEngn Conference 11
DTrace를 보안 관점에서 활용해보자!
DTrace 프레임워크는 솔라리스 기반으로 개발된 동적 추적 프레임워크로 현재 Solaris, Mac OS X, BSD 등에 적용되고 있다. 프레임워크는 운영체제 개발 시점에 커널에 통합된 프레임워크로 사용자 및 커널 레벨의 다양한 정보(메모리나 CPU, 파일시스템, 네트워크 자원의 모니터링이나 특정 함수의 인자 추적 등)를 동적으로 분석할 수 있게 하여 애플리케이션 테스팅에 주로 활용되고 있다. 이러한 장점을 활용하여 최근에는 보안 관점에서 프레임워크를 사용하는 경우가 늘어나고 있다. 퍼징 모니터링이나, 바이너리 동적 분석과 같은 취약점 분석, 악성코드 동적 분석, 루트킷 개발이 한 예이다. 본 발표에서는 DTrace가 무엇인지 살펴보고, 윈도우의 filemon의 기능을 구현해보도록 한다. 이 발표를 통해 분석가에게 생소할 수 있는 Mac OS X의 바이너리 분석에 도움이 될 것이라 생각한다.
http://codeengn.com/conference/11
http://codeengn.com/conference/archive
2. 1. 설치해 봅시다 .
• 필요한 것은 다 설치해봅시다 .
https://www.python.org/downloads/
-> 3.4 버전
-numpy, scipy,matplotlib 를 설치해봅시다 .
(1)OS 가 윈도우라는 전제 하에
- http://www.lfd.uci.edu/~gohlke/pythonlibs/
(2)버전에 맞는 라이브러리를 받아보십다 .
(3)설치해 보십다 .
Dos Command 를 실행 -> pip 명령어를 수행 합니다 .
3.
4. 2. Why Python?
• 일단 쉽다 .
• 쉬운만큼 쓰기도 쉽다 .
• 하나 개발해 놓으면 다른 플랫폼에서도 적용이 가능하다 .
-> Web, PC, Smart Phone App 등
• 라이브러리가 많다 .-> 내가 직접 알고리즘을 개발할일이
많지않다 .
• 써드 파티언어로 인기가 많다 .
-> QGIS(PyQGIS), ArcGIS(ArcPy)
8. 3. 기초문법 (4)
• for 문과 range
Range
예 ) range(1,10)
list(range(1,10))
>>> for i in range(0, 11):
print(i)
>>> interest_stocks = ["Naver", "Samsung", "SK Hynix"]
>>> for company in interest_stocks:
print(company)
// 리스트 와 튜플 의 차이
>>> interest_stocks = ("Naver", "Samsung", "SK Hynix")
>>> for company in interest_stocks:
print("%s: Buy 10" % company)
9. 3. 기초문법 (5)
• for 문과 Dictionary
- 데이터를 필드 와 값으로 구분하는 경우
예 )
interest_stocks = {"Naver":10, "Samsung":5, "SK Hynix":30}
for company, stock_num in interest_stocks.items():
print("%s: Buy %s" % (company, stock_num))
10. 3. 기초문법 (6)
• 함수를 써봅시다 .
def print_ntime(n):
for i in range(n):
print(“ 서울시립대 공간정보공학과 ")
실행
Print_ntime(3)
11. 3. 기초문법 (7)
• 이미있는 라이브러리를 쓰고자 할 때
- Import 라이브러리 명을 씀
- 도대체 라이브러리를 왜쓰는 건가 ?
1)이미있는 기능인대 왜 또 짜…
2) 애인 영희 보러가야 하는데 시간도 없어
3) 내가 다알고리즘을 알지만 조금 구현하는데 자신없어
4) 기타 ( 손이 가려워서… .)
12.
13. 간단한 차트 그리기
import matplotlib.pyplot as plt
plt.plot([1,2,3,4])
plt.ylabel('some numbers')
plt.show()
14. >>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> x = np.linspace(0, 1, 500)
>>> y = np.sin(4 * np.pi * x) * np.exp(-5 * x)
>>> fig, ax = plt.subplots()
>>> ax.fill(x, y, zorder=10)
>>> ax.grid(True, zorder=5)
>>> plt.show()
15. from mpl_toolkits.mplot3d import
axes3d
import matplotlib.pyplot as plt
from matplotlib import cm
fig = plt.figure()
ax = fig.gca(projection='3d')
X, Y, Z = axes3d.get_test_data(0.05)
cset = ax.contourf(X, Y, Z,
cmap=cm.coolwarm)
ax.clabel(cset, fontsize=9, inline=1)
plt.show()
16. import numpy as np
import matplotlib.pyplot as plt
N = 50
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = np.pi * (15 * np.random.rand(N))**2
# 0 to 15 point radii
plt.scatter(x, y, s=area, c=colors,
alpha=0.5)
plt.show()
17. 간단한 지도 사용하기
1. 일단 라이브러리를 설치 합시다 .(pyproj, BasemapTOOLKIT)
http://www.lfd.uci.edu/~gohlke/pythonlibs/
18. from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
map = Basemap(projection='merc', lat_0 = 57, lon_0 = -135,
resolut ion = 'h', area_thresh = 0.1,
llcrnrlon=-136.25, llcrnrlat=56.0,
urcrnrlon=-134.25, urcrnrlat=57.75)
map.drawcoastlines()
map.drawcountries()
map.fillcontinents(color = 'coral')
map.drawmapboundary()
plt.show()
19. from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
map = Basemap(projection='merc', lat_0 = 57, lon_0 = -135,
resolut ion = 'h', area_thresh = 0.1,
llcrnrlon=-136.25, llcrnrlat=56.0,
urcrnrlon=-134.25, urcrnrlat=57.75)
map.drawcoastlines()
map.drawcountries()
map.fillcontinents(color = 'coral')
map.drawmapboundary()
lon = -135.3318
lat = 57.0799
x,y = map(lon, lat)
map.plot(x, y, 'bo', markersize=24)
plt.show()
26. 조별과제후보 1
• Python Folium 으로 자기가 잘가는 곳을 찍어오기
(10 개이상 )
- 반드시 html 과 코드를 내야함
27. PYSAL 라이브러리
• 넌 대체 머하는 넘이냐… ?
- 공간데이터 내부구조를 분석할 수 있음
- 공간데이터 파일을 읽고 쓰기가 가능함
- SHP, CSV, LOTUS,WKT 파일 등을 핸들링이 가능함
- 고급 공간분석알고리즘을 아무렇지 않게 사용할 수있다 .
- ArcGIS, PyQGIS 도 요놈을 씀
- 분명 잘 익혀두면 좋은 날이 올까 ?
41. 영상을 분류해 보십다 .
# 소스 파일과 레이어 이름 정의
srcFile = "c:/seoul_raster/landsat.tif" # source file
lyrName = "landsat" # layer name
# 레이어 생성
from qgis.core import QgsRasterLayer
rasterLyr = QgsRasterLayer(srcFile, lyrName)
# 목록에 레이어 추가
# QgsMapLayerRegistry.instance().addMapLayers([rasterLyr])
c = QgsColorRampShader()
c.setColorRampType(QgsColorRampShader.INTERPOLATED)
from PyQt4 import QtGui
i = []
i.append(QgsColorRampShader.ColorRampItem(0, QtGui.QColor('#000000'), '0'))
i.append(QgsColorRampShader.ColorRampItem(6, QtGui.QColor('#ffffff'), ''))
i.append(QgsColorRampShader.ColorRampItem(36, QtGui.QColor('#c4baa4'), ''))
i.append(QgsColorRampShader.ColorRampItem(36.5, QtGui.QColor('#b4966c'), '0.1'))
i.append(QgsColorRampShader.ColorRampItem(97.1, QtGui.QColor('#a4824c'), ''))
i.append(QgsColorRampShader.ColorRampItem(97.6, QtGui.QColor('#94723c'), ''))
i.append(QgsColorRampShader.ColorRampItem(128, QtGui.QColor('#7c9e2c'), '0.2'))
i.append(QgsColorRampShader.ColorRampItem(160, QtGui.QColor('#94b614'), ''))
i.append(QgsColorRampShader.ColorRampItem(190, QtGui.QColor('#74aa04'), '0.3'))
i.append(QgsColorRampShader.ColorRampItem(219, QtGui.QColor('#64a204'), ''))
i.append(QgsColorRampShader.ColorRampItem(241, QtGui.QColor('#549604'), '0.4'))
c.setColorRampItemList(i)
s = QgsRasterShader()
s.setRasterShaderFunction(c)
ps = QgsSingleBandPseudoColorRenderer(rasterLyr.dataProvider(), 1, s)
rasterLyr.setRenderer(ps)
# 목록에 레이어 추가
QgsMapLayerRegistry.instance().addMapLayers([rasterLyr])
42. 심화 학습 -> 이게 먼 심화 학습
• Ndvi 를 구해 봅시다 .( 그래도 함 해보세요 )
근데 Ndvi ( 식생지수 ) 가 머죠 ?
인공위성이나 항공기를 이용하여 관측한 다중 분광대 영상 자료는 지상의
대상물이 각 파장대별로 독특한 특성을 나타내므로 이 특성을 이용하면 원
하는 정보를 추출해 낼 수 있다 . 특히 , Landsat 등 지상관측 위성의 주 관
심 범위인 육지 표면의 영상 자료는 95% 이상이 토양과 식생에 관한 정보
를 포함하고 있으므로 이 영상 자료를 이용하면 지표면의 식생 분포나 식
생 밀집도를 추정하는 것이 가능
44. 조별과제 후보
논문 : Otsu, N., 1979. A threshold selection method from gray-level
histogram. IEEE Transactions on Systems, Man, and Cybernetics 9, 62–66.
PDF: http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=4310076
제공된 서울시립대영상에서 ndvi 혹은 오츠 임계치를 구해봅시다 .