HDFql research

HDF5는 여기를: https://www.hdfgroup.org
HDFql 사이트는: https://www.hdfql.com

HDF5는 scientific data container포맷으로 개발된 - 꽤 유서(?) 깊은 라이브러리입니다. 역사를 따져보면 80년대까지 간다고 합니다. HDF4를 거쳐 HDF5에 이르렀습니다. 기본적으로 parallel IO와 커플링해서 초대형 시뮬레이션의  IO에 많이 쓰입니다. 대략 2-3년전에 Lustre 에서  1 trillion grid data  - single precision 이니까 4byte * 1,000,000,000, 000 = 4TB 파일 하나 만들어서 2000개 정도의 cpu를 써서 렌더링 했던적이 있습니다. 

netcdf처럼 scientific community에서 조용히 쓰이던 데이터 포맷/컨테이너였습니다만 - deep learning community 에서 데이터 포맷으로 쓰면서 폭발적으로 인기(?)를 얻게됩니다.  대부분 python 에서 h5py를 쓰게 되고, 데이터를 읽은후 numpy로 옮겨서 작업을 하곤 하지요.

C/C++/Fortran의 경우엔 bare API를 쓰게되는데 - C++은 아직 experiment단계입니다. parallel HDF5를 빌드하면 자동적으로 C++ API는 disable 됩니다 - 이게 꽤나 뜨악하단 말이죠. 간단히 예를 보면:

    hid_t hfile, hspace, plist, hset, hgrp;
    herr_t hstatus;
    hfile = H5Fcreate(fn.c_str(), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
    hgrp = H5Gcreate2(hfile, "/GRP1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
    size_t ncols = 4;
    size_t nrows = 1;
    hsize_t dims[2] = {1, ncols};
    hspace = H5Screate_simple(2, dims, NULL);
    plist = H5Pcreate(H5P_DATASET_CREATE);
    H5Pset_layout(plist, H5D_CHUNKED);
    hsize_t cdims[2] = {1, ncols};
    H5Pset_chunk(plist,2,cdims);
    hset = H5Dcreate(hfile, "/GRP1/VDAT0", H5T_NATIVE_DOUBLE, hspace,
     H5P_DEFAULT, plist, H5P_DEFAULT);
    H5Pclose(plist);
    H5Dwrite(hset, H5T_NATIVE_DOUBLE, H5S_ALL, hspace, H5P_DEFAULT, xx.data());
    H5Sclose(hspace);
    H5Dclose(hset);
    H5Gclose(hgrp);
    H5Fclose(hfile);

대략 1. 파일 열고 2. 그룹 열고 3. data space 열고 4. 디스크 절약을 위해 chuncking할꺼면 추가로 설정 넣고 5. datat set엽니다. 6. 이제야 데이타를직접쓰고 7. data set 닫고 8. data space닫고 8. 그룹닫고 9. 파일을 닫습니다... 

추가적인 설정이 가능하고 MPI관련해서 collective/independent등의 설정이 가능하다 보니 이런 식으로 쓰긴하는데 초보자나 입문자에게는 꽤나 공포스럽지요. 게다가 C-API로 작업을 해야하니 (MPI쓸경우).  너무 방대하고 자잘한 설정이 과연 필요한가에 대한 문제도 있어서, API를 좀 더 abstract하게 만들자는 프로젝트들이 있습니다. 그중 하나가  HDFql인데, 기본적인 아이디어는 HDF5를 SQL 비스무레하게 쓰자~ 라는 방식입니다.  샘플 코드는 아래에:

    HDFQL_CURSOR my_cursor;
    hdfql_execute("CREATE FILE result_HDFql.h5");
    hdfql_execute("USE FILE result_HDFql.h5");
    hdfql_execute("CREATE GROUP GRP1 ORDER TRACKED");    
    hdfql_execute("CREATE DATASET GRP1/VDAT0 AS DOUBLE (4)");
    std::string script="INSERT INTO GRP1/VDAT0 VALUES FROM MEMORY ";
    script += std::to_string(hdfql_variable_transient_register(x));
    std::cout << script << std::endl;
    hdfql_execute(script.c_str());
    hdfql_execute("CLOSE FILE");

스텝자체는 위와 유사 합니다. 파일/그룹/데이타 순으로 열고 닫긴 하는데 기본적인 커맨드는 SQL의 커맨드와 거의 같죠. 확실히 코딩의 양이나 workflow의 복잡성을 낮춰줍니다. 그러면 hdf5에서 HDFql로 migration 할꺼냐 라고 물으신다면...
- MPI indepedent write가 필요한데 이게 좀 불확실... 예제를 못찾겠네요.
- 소스코드는 비공개입니다. pre-built binary만 공개되는데 지원되는 gcc나 MPI버전이 한정적입니다.

방식자체는 꽤 좋은 idea이긴 한데 아직은 premature하다고 할까요. 좀 더 지켜봐야 할 듯 합니다.

Ford Maverick + Oreo thin collaboration 일상

출처는:
1. https://www.adweek.com/brand-marketing/to-keep-kids-away-from-parents-cookies-oreo-thins-put-other-brands-logos-on-package/
2. https://www.newsweek.com/oreos-new-marketing-strategy-disguises-packaging-ford-maverick-owners-manual-1609438

꽤나 묘한 콜라보 입니다 - 포드 매버릭 사용자 매뉴얼...인척하는 오레오 포장이라는데요, 포드 말고도 완두콩/속옷/요리책 위장버전도 있습니다. 측면만 봐서는 오레오인줄 모르니까 애들이 안건드릴꺼다~ 라는 건데... 진짜로 파는건지 장난삼아 만든 광고인지 잘 모르겠네요.

어쨌거나 - 포드 매버릭이 공개된지 한달 되었고 - 현대 산타크루즈의 가격도 공개되었습니다. 2만4천불에서 시작한다고는 하는데 배달료 생각하면 2만5천언저리에서 시작할듯 하군요. 이정도면 매버릭 보다는 레인저와 경쟁할 듯 한데 연말정도나 되어야 제대로된 분석이 될 듯 합니다.

픽업트럭 커뮤니티에서는 매버릭vs산타 크루즈의 경쟁구도를 잡고 있습니다만 정작 가격때문에 되려  매버릭vs시빅/코롤라 구도로 가지않겠냐는 분석도 많습니다. 포드에서는 연간 십만대 판매 예측을 하고 있다고 하는데, 과연 어느정도 팔릴런지.

개인적으로 매버릭에서 놀라왔던 점은 - 대개 동일 모델에서, 하이브리드 버전은 기존 엔진에 비해 2,3천불 더 얹어야 하는 경우가 대부분이 었습니다. 코롤라 기본/하이브리드의 경우 2만/2만3천6백불 정도 차이가 납니다. 그런데 매버릭에서는 이게 반대란 말이죠 - 하이브리드 버전이 되려 가격이 낮다니 ... 뭔가 품질에 문제가 있는게 아니냐는 추측도 있고. 사실 마력수나 토잉 한계치를 보면 트럭이라기 보다는 트럭 코스프레를 하는 오픈 카고 컴팩 suv정도 될 듯 합니다만. 

2008년 경제위기 당시, 미국 차량들에 대해 가해졌던 비난들이 - 쓸데 없이 덩치만 크고 기름만 먹는다 였는데... 2021년에 이르러 연비의 미국차, 파워의 한국차를 보게 되다니, 왠지 감개무량하다는.

Ford Maverick 일상

최근 포드 매버릭이 발표 되었죠 - 크고 아름다운(?) 트럭들만 만든다고 하는 포드에서 나온 초미니트럭입니다 - 그래도 왠만한 소형 SUV보다 크다는.

회사가 기름회사이다보니 -  연비나 환경평가가 얼마나 빡세져가는지를 체감중입니다. 뭐 당연히 경쟁 1순위는 전기차입니다만, 전체적인 carbon footprint를 비교해보면 아직까지는 hybrid엔진이 더 우위에 있는 걸로 평가되고 있습니다. 가정용 차량으로 프리우스를 시작해서, hybrid 엔진은 꽤 널리 쓰이고, 인기도 좋습니다만 트럭쪽으로는 뭔가 애매하죠 - 연비향상이 있다고 주장은 합니다만 F150를 보면 10%정도?  시빅이 20%이상 연비가 올라가는 걸 생각해보면 하이브리드엔진으로 토크 올리기가 어려운 걸까요.

어쨌거나 - 매버릭이 등장했고, 하이브리드 엔진이 탑재 됩니다 (에코 부스트 엔진도 있긴합니다. 아마 럭셔리/고급 모델로 나올듯). 4륜구동은 아니고 전륜만 가능한데 - 에코부스트엔진의 경우엔 AWD도 가능 -  이래저래 가격 낮추려고 애쓰는게 보입니다. 브롱코/에스케이프와 호환되는 부품이 많기도 하고.

연비는 대략 40 MPG 라고 합니다 - 지금 쓰고 있는 스바루 포레스터가 고속도로에서 32mpg  - 19년전 샀던 혼다 시빅이 고속도로에서 40mpg 가 나왔단 말이죠. 트럭에서 동급의 연비가 나오다니, 기술력의 발전은 대단합니다.

뭐 미국차... 이다 보니 마감이나 이런저런 면에서 일제나 한국제에 비하면 군소리가 안나올수는 없겠지만, 픽업트럭을 2만불 근처에 살수 있다는 건 꽤나 놀라운 얘기입니다  - 게다가 연비가 좋고. small business 사업자들을 겨냥해서 나오는 거 아니냐는 얘기도 있던데, 그렇게 따지면 2열 시트는 필요 없는게 아닐까 싶기도.

PS.
사실 포드 매버릭은 소형 세단의 이름이었습니다. 위키 검색해보면 70년대에 생산되었었다고 나옵니다. 게다가 Ford Escape를 유럽에 수출하면서 쓴 이름이 Ford Maverick이었고.... 뭐냐 이 대환장 파티는.

Google custom search API for Python research

CLI 에서 Google Custom Search API를 써보고 있습니다...
소개 차원에서 조금 올려보죠.

1. 구글 계정이 있다면 구글 콘솔로 로그인 합니다: https://console.developers.google.com
2. 프로젝트 하나 만들고:

3. query에서 Custom Search API를 찾습니다. Enable 시켜 놓고:
4. Dashboard로 돌아와서 Credentials -> CREATE CREDENTIALS ->API key를 골라줍니다.
처음 API KEY를 만들면 unrestricted로 만들어 집니다. 도난이나 오남용을 막기 위해 restrict를 걸어줍니다.
5. 검색엔진을 하나 만듭니다.  cse.google.com/cse 로 가서
만들고 나서, Edit search engine -> 엔진 선택 -> Setup -> Search engine ID를 찾습니다.  나중에 cx argument 에 해당됩니다.

6. 이제 CLI에서 Python을 돌릴 차례입니다. PIP에서 구글 패키지 깔아주고: pip3 install google-api-python-client
api_key값 넣어주고 - cx 는 search engine ID 입니다. 'customsearch', 'v1'는 구글 API에서 제공하는 API 이름과 해당 버전입니다. 자세한 내용은 여기를: https://github.com/googleapis/google-api-python-client/blob/master/docs/dyn/index.md

resource.list().execute()를 돌리면 검색값을 주는데 - 10개가 최대입니다. 10개이상을 검색하려면  start 변수를 조정해가면서 연속적으로 execute()해줍니다.

대강 보아하니 API를 Google Cloud에 연동해 놨네요. 그냥 개인컴에서 간단히 이것저것 - 무료서비스에 한해 - 써보고 있는데 ... 꽤 복잡합니다. 여기저기 Tutorial들이 있긴한데 개인적으로 예상하던 내용과는 차이가 좀 있네요. 계속 써보고  추후에 더 올려보죠.

1 2 3 4 5 6 7 8 9 10 다음