옵티마이제이션 자동화 하기(라이노 + 그래스호퍼)
이런분들께 유용합니다.
- 이미 라이노 + 그래스호퍼에서 갈라파고스 등으로 최적화를 할 수 있는분
- 같은 최적화 템플릿으로 여러 오브젝트를 최적화를 효율적으로 하길 원하는 분
장점
- 수동조작 시간을 줄여주기 때문에, 업무를 효율화 할 수 있음
- "얼마나 많은 작업자가 필요한가" -> "얼마나 많은 컴퓨터(또는 컴퓨터 파워)가 필요한가"
Summary
이 글에선, 동일한 옵티마이제이션 탬플릿을 통해 여러 오브젝트를 자동으로 최적화하는 방법론에 대해 다루겠습니다.Main
지난 회사에서 하던 프로젝트 중, 동일한 옵티마이제이션 템플릿을 이용해서 여러 오브젝트(지오메트리)를 최적화하는 업무가 있었습니다. 그 당시 CATIA(또는 3DEXPERIENCE)를 이용했습니다. CATIA는 Geometrical set이라는 독특한 구조를 가지고 있고, 이 안에 geometry 뿐만 아니라 다양한 정보 및 optimizer도 포함 할 수 있습니다. 그래서 각 오브젝트에 옵티마이저를 넣고, 나중에 트리거 버튼을 통해 동시에 최적화가 가능합니다.프로젝트가 끝나고 이런 질문을 해봤습니다 "같은 방법론을 라이노 + 그래스호퍼로 할 수 있을까?" 만약 가능하다면, 다윗과 골리앗의 싸움에 큰 실마리를 제공할 수 있다고 생각했습니다. 다른 글에서도 쓴 것 같은데, CATIA는 최소 라이노 보다 10배는 비싼 도구입니다. 그만큼 많은 기능들도 있겠지만, geometry만 다루는 측면에서 같은 작업을 해보고 싶었습니다.
라이노 가격. G마켓 등에선 90만원 이하로도 구입 가능합니다. |
카티아 가격. 약 10배를 지불해야하며, 유지비용은 별도입니다. |
갈라파고스 일반적인 방법론 우측 상단이 갈라파고스이며, 직접 조작해줘야합니다. |
예제에서 제공한 것은, Anemone라는 Looping에 특화된 플러그인과, Octopus내의 옵티마이제이션과 관련된 컴포넌트들을 조합해서 사람의 직접적인 조작이 거의 없이 자동으로 최적활르 해주는 것이었습니다. 기본 예제는 하나의 오브젝트에 대한 얘기였어서 Loop in Loop를 만든다면 여러 오브젝트에 대해서도 가능하리라 생각했습니다.(큰 Loop는 오브젝트를 선택, 작은 Loop는 옵티마이제이션을 담당). 상당히 오랜 기간 테스트를 했습니다.
그리고 간신히 되도록 만드는데 성공했지만, 약 1000회의 반복작업이 이뤄지면 갑자기 멈췄습니다. 1000번이면 많다고 생각할 수 있지만 최적화시, 한 오브젝트에대해 200번의 반복설정을 걸면 약 5개 정도 하면 끝나는 수준입니다. 제가 목표로 삼았던 오브젝트의 갯수는 80개였기 때문에, 한참 미치지 못하는 수준이었습니다.
아쉬움을 뒤로하고 다른 방법을 찾기 시작했습니다. 다행히도 Octopus내의 다른 컴포넌트들이 열쇠를 쥐고 있었습니다. Octopus도 여러 업데이트를 거치며 다양한 컴포넌트가 추가되었고, 그중 하나를 사용할 수 있었습니다. 최초 Octopus에 포함되어있던 컴포넌트는 Multi-target optimization과 Boolean값을 넣을 수 있지만 여전히 수동조작에 의존하는 단점이 있습니다. 하지만 새로 나온 컴포넌트의 경우 SVM(Support Vector Machine), ANN(Artificial Neural Network) 등 최근 개념등을 기반으로 작동해 이해하기 어려운 점은 있지만, 수동조작 없이 사용 가능한 장점이 있습니다.
이 컴포넌트들은 다음과 같은 사항을 충족했습니다.
- 더블클릭 없이 작동 가능
- 루프 등을 통해 여러 오브젝트에 대해 사용가능
주요 컴포넌트들 |
각각 Octopus, Treesloth, 그리고 그래스호퍼에 내장된 컴포넌트들입니다. 방법론은 다음과 같습니다. 가장 왼쪽의 컴포넌트와 "Run"을 인풋으로 받는 컴포넌트들은 "0"이외의 숫자를 넣음으로서 작동시킬 수 있습니다. 따라서 넘버슬라이더를 오브젝트의 인덱스, 더 구체적으로는 "List item" 컴포넌트와 옵티마이저에 연결시키면 오브젝트를 선택하는 동시에 최적화를 시작할 수 있습니다.
이렇게 한개에 대한 최적화가 끝나면 이에 대응되는 파라미터들이 있을 것입니다. 저는 이들을 파일로 내보내기 한 후 나중에 모든 오브젝트에 대한 작업이 끝난후 다시 불러오기를 통해 결과를 보는 방식을 채택했습니다. 혹시나 모를 중간 오류로 모든 작업이 날아가기보단 각각을 하나씩 파일로 저장해서 오류가 난 부분부터 다시 시작할 수 있게 하기 위해서 였습니다.
이 시나리오를 위해 C#이나 Python을 이용해서 내보내는 방법도 있지만 Treesloth안의 "Unpack / Pack"이라는 컴포넌트를 사용하였습니다. 사실 Unpack / Pack을 사용한건 실수였습니다. 내장 컴포넌트로 착각했죠. 사용하는 플러그인을 줄이시고 싶다면 C# 이나 Python을 하나정도 추가되도 상관없으시다면 Treesloth를 이용하시면 될 것 같습니다.
옵티마이제이션 그래스호퍼 코드 |
모든 오브젝트에 대해서 작업을 끝내는건 여러 요인에 따라 다를 겁니다. 단순히 컴퓨터의 속도 문제일 수도 있고, 같은 결과를 얻기 위한 모델링 프로세스를 얼마나 합리적으로 구성했느냐도 있을 겁니다. 서버나 드랍박스를 기반으로 하신다면 여러 컴퓨터를 이용, 0~9 구간은 컴퓨터 1이, 10~19구간은 컴퓨터 2가...n~m까지 구간은 컴퓨터 l이 담당하는 방식으로 파라미터만 모아서 나중에 한번에 확인해보는 방법도 가능할 것입니다.
저장된 파라미터들 |
댓글
댓글 쓰기