Медленный рендеринг vtk на машине ec2Python

Программы на Python
Ответить
Anonymous
 Медленный рендеринг vtk на машине ec2

Сообщение Anonymous »

Я запускаю следующий код для рендеринга 3D-сетки с помощью vtk.
На моем MacBook Pro M2 (32 ГБ ОЗУ) код выполняется значительно быстрее по сравнению с экземплярами AWS EC2, включая как процессор (c7i.8xlarge), так и графический процессор (g5.2xlarge).
В частности, вызов window_to_image_filter.Update() примерно в 100 раз медленнее облачные машины. Я подозреваю, что это как-то связано с повреждением экрана.

Код: Выделить всё

Class MyRenderer:
def __init__(self, mesh: trimesh.Trimesh):
self.vtkmesh = create_vtk_mesh(mesh.vertices, mesh.faces) # This returns vtkPolyData mesh
self.renderer = vtk.vtkRenderer()
self.render_window = vtk.vtkRenderWindow()
self.render_window.AddRenderer(self.renderer)
self.render_window.SetOffScreenRendering(False)
self.render_window.SetSize(128, 128)

mapper = vtk.vtkPolyDataMapper()
mapper.SetInputData(self.vtkmesh)
actor = vtk.vtkActor()
actor.SetMapper(mapper)
self.renderer.AddActor(actor)
self.camera = vtk.vtkCamera()
self.camera.ParallelProjectionOn()
self.camera.SetParallelScale(75)
self.camera.SetClippingRange(1, 400)
self.renderer.SetActiveCamera(self.camera)
self.render_window.Render()

def render_mesh(self, camera_position: np.ndarray, camera_focal_point: np.ndarray, pts_3d=None):
self.camera.SetPosition(*camera_position)
self.camera.SetFocalPoint(*camera_focal_point)
view_matrix = self.camera.GetViewTransformMatrix()
projection_matrix = self.camera.GetProjectionTransformMatrix(1, -1, 1)
view_matrix_np = np.array([view_matrix.GetElement(i, j) for i in range(4) for j in range(4)]).reshape((4, 4))
projection_matrix_np = np.array([projection_matrix.GetElement(i, j) for i in range(4) for j in range(4)]).reshape((4, 4))
rotation_det = np.linalg.det(view_matrix_np[:3, :3])
imaging_matrix = projection_matrix_np @ view_matrix_np

sensor_normal = camera_focal_point - camera_position
sensor_normal = sensor_normal / np.linalg.norm(sensor_normal)
sensor_plane = sensor_normal[0], sensor_normal[1], sensor_normal[2], -np.dot(camera_position, sensor_normal)

self.renderer.SetActiveCamera(self.camera)
self.render_window.Render()

window_to_image_filter = vtk.vtkWindowToImageFilter()
window_to_image_filter.SetInput(self.render_window)

# Bencmark:
# On Apple MAC M2 - 0.001
# AWS EC2 c7i.8xlarge Amazon linux (cpu) - 0.130
# AWS EC2 g5.2xlarge Ubuntu (GPU) - 0.134
with timing('this is slow'):
window_to_image_filter.Update()
Вот результаты тестов для строки window_to_image_filter.Update():
  • Mac M2: ~0,001 секунды< /li>
    AWS EC2 c7i.8xlarge (ЦП): ~0,130 секунды AWS
  • EC2 g5.2xlarge (ГП): ~0,134 секунд
Что я пробовал
  • Запуск кода с помощью xvfb для виртуальных отображение на EC2 (обязательно).
  • Перешел с vtk-9.4.0 на vtk-osmesa, но производительность осталась прежней.
Я подозреваю, что проблема может быть связана с отсутствием физический экран или аппаратные оптимизации. Есть ли способ сделать рендеринг на EC2 таким же быстрым, как на моем Mac, или хотя бы в 10 раз быстрее?
Поскольку я вызываю render_mesh() примерно на 500 различных camera_position< /code> в моем потоке, мне важно его ускорить.
Как оптимизировать конвейер рендеринга на AWS EC2, чтобы сократить время выполнения window_to_image_filter.Update()? р>
Существуют ли конкретные конфигурации или требования к оборудованию, которые могли бы устранить это несоответствие производительности?
Будем благодарны за любые рекомендации!

Подробнее здесь: https://stackoverflow.com/questions/792 ... c2-machine
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»