UBER ATG
- Machine learning lead autonomous driving
Why AI?
- 2016 was the deadliest year for driving
- On average, 9% increase from 2010 to 2016
Even though vehicle safety continues to improve, it might not be enough: 94% of crashes could be linked back to the driver. So it seems appropiate to remove the human factor from the scene and use tech to diminish risk factors.
There are lots of moving parts when modelling traffic. Hence the difficulty of doing it in a classic way.
Supervised Learning: traffic images labeled (by their own team) Lesson learned: successful learning comes from lots of data + lots of cycles + careful learning
What makes a successful model? Given their bussiness case:
- accuracy
- fast to iterate and fix
- deployability
- time to recognize
This last item is quite important: the model must be "real time"
They need a detailed mapping of new roads
All signals used to localize itself on its surroundings -> accuracy is within 2cm generally
- What is going on around the car?
- What are the moving actors on the scene?
- their speed
- acceleration
- etc Speed vectors of several moving actors on the scene could be seen on the footage
How will the system evolve?
Input destination -> routing -> motion planning -> vehicle control
- 20hs of human driving footage
- human actions as input signal
- data augmentation
- provide scenes not in the footage
- create variations on the footage
- nn & exec (tensorflow, caffe, etc)
Safety driver + copilot The slightest force to activators disables the system for the safety driver to take over control
- Thousands of hours of simulation
- User feedback!
- Most peole are excited
- They want to learn more
- Average of 293 hs/year driving
- $960 p/year in traffic delays spent per person
- 1bn vehicles
- 96% sit idle
- parking space required
Julián Bayardo, julian.jbayardo@mercadolibre.com
https://slides.com/jbayardo/pydata-cordoba-2018/fullscreen#/
http://cor.to/pydatahpc Cientificos formados que desarrollan computo de alto desempeño desde hace varios años en fortran77 por ejemplo. Hay una camada de fisicos, quimicos, biologos mas jovenes que tienen la filosofia mas de python.
Lo que termina pasando es que colisionan estas dos filosofias. A los desarrolladores de hpc lo que les importa es aprovechar toda la capacidad de computo de las pcs y tener el resultado rapido. Cada minima mejora sirve para una simulacion que tarda 3 semanas, por ejemplo. Python se queda corto en lo que es performance para hpc.
Python3.5+ Type hinting, quizas el duck typing termina generando un codebase un tanto inmantenible.
Escalar verticalmente para tener mejor performance alcanza en la mayoria de los casos. Pero cuando estas usando algo que no escala verticalmente? Se justifica cualquier mejora de performance. El esfuerzo, tiempo invertidos terminan mejorando el proceso, que no se justifica en la mayoria de los casos.
Numpy tiene una performance comparable con C, pero te limita a lo que esta implementado ahi. Tiene una serie de libraries historicas de algebra lineal accesibles desde python.
C y Fortran se pueden linkear, porque compilan a lenguaje de maquina. Tenemos que poder comunicar python con C!
- Escribir codigo en python
- Escribir la parte que consume tiempo en C
- Escribir una api C/Python
Esto es basicamente lo que hace numpy.
- Contruir el modulo de python en C (onda cpython)
- Ctypes: llamar a funciones de C definiendo los tipos en python
- Cython (o Numba): autogenerar codigo de C desde Python (transpilador)
- F2PY: para fortran, facil de usar, problemas de memoria
- BOOST para C++, SWIG para muchisimos lenguajes
El primero tiene el problema de que es muy trabajoso, hay que usar la api de python en C.
Cython tiene el problema de que como autogenera codigo C, cuan rapido sea depende del transpilador y de que tan bien conozcas este nuevo lenguaje. Que hay que requerirle a cython para que haga las cosas bien. Ctypes parece el ganador.
CTypes tiene dos cosas:
- expone los tipos de c
- dynamic loader
>>> import ctypes as C
>>> math = C.CDLL('./libmymath.so')
>>> math.add_int(3,4)
7
>>> math.add_float(3,4)
0
>>> math.add_float(3.0,4.0)
Traceback (most recent call last):
File "<input>", line 1, in <module>
math.add_float(3.0,4.0)
ctypes.ArgumentError: argument 1: <class 'TypeError'>: Don't know how to convert parameter 1
Un float de python no es un float de IEEE, sino un objeto que tiene un valor adentro. Entonces pincha!
>>> math.add_float(C.c_float(3.0),C.c_float(4.0))
2
El problema que teniamos con la entrada lo tenemos con la salida. No especificamos que lo que esperamos de la salida sea un punto flotante de C.
>>> math.add_float.restype = C.c_float
>>> math.add_float(C.c_float(3),C.c_float(4))
7.0
Es medio feo. Entonces asi como podemos espcificar el tipo de salida, podemos especificar los tipos de entrada:
>>> math.add_float.argtypes = [C.c_float, C.c_float]
>>> math.add_float(3,4)
7.0
Podemos pasar punteros a los valores asi:
>>> tres = C.c_int(3)
>>> cuatro = C.c_int(4)
>>> res = C.c_int()
>>> math.add_int_ref(C.byref(tres), C.byref(cuatro), C.byref(res))
0
>>> res.value
7
Esto se usa creando una funcion de python que use ctypes para que al usuario de mi library le sea transparente.
Como se hace el memory management? En general, debería hacerse desde python. Como allocar un array en python?
>>> import ctypes as C
>>> math = C.CDLL('./libmymath.so')
>>> in1 = (C.c_int * 3)(1, 2, -5)
>>> in2 = (C.c_int * 3)(-1, 3, -3)
>>> out = (C.c_int * 3)()
>>> math.add_int_array(C.byref(in1), C.byref(in2), C.byref(out), 3)
0
>>> out
<__main__.c_int_Array_3 object at 0x7faa65e0e400>
>>> out[0], out[1], out[2]
(0, 5, -8)
Se puede usar ctypes para devolver objetos de numpy.
En rectangle.c
vemos un struct. Como puedo aprovecharlo como un objeto de Python? Es el salto final para conectarlos.
Tenemos la library geometry_minimal.py
lista.
>>> import geometry_minimal
>>> r = geometry_minimal.Rectangle()
>>> r.width = 10
>>> r.height = 30
>>> geometry_minimal.area(r)
300.0
Pero este enfoque no es OO puro. En geometry.py
vemos algo mas parecido a algo que usariamos en Python.
>>> import geometry
>>> rectangle = geometry.Rectangle(10,30)
>>> rectangle.area()
300.0
Es mucho más limpio al usuario. Prestar atencion en geometry.py
a lo siguiente:
def area(self):
return CLIB.area(self)
Cuando recibo self, lo que tengo es la posicion de memoria de la instancia. Entonces lo que hago es un wrapper para devolver el resultado de CLIB.area
.
Podemos tener software para HPC que se vea como Python pero corra C en el fondo, para ser performante.
Quien da la charla cuenta que el usa Python, C, CUDA, assembly. Pero Python es lo que pega todo.
CPython te prohibe multithreaing (por el Global interpreter lock). Se puede bypassear como hace multiprocessing: spawnear varios interpretes. La library que se carga de C puede usar threading. Hay implementaciones de MPI para multithreading.
Otro ejemplo donde se libera el GIL es cuando se lee de disco.
Chargebacks are less than 1% if the total, but when you have such a big scale, it sure looks like a lot of money. typically, e-commerce have a yearly "black friday" but for food delivery platforms, it might be about once a week. So, it's necessary to predict which transactions will be good and which ones will be a chargeback.
Lessons:
- Infrastructure before models
- Spark + mleap (https://github.com/combust/mleap)
- Don't wait until the best model to put something in production
- Make it easy to get data
- Make sure that you can monitor your model in production
Kilimo: le dice a los productores cuanto regar y cuando Usan datos. Al principio de la temporada se toma una muestra de suelo. Luego con imagenes satelitales y datos meteorologicos se calcula la evotraspiracion. Luego con una app el productor pone las precipitaciones y te dice cuando y cuanto regar.
Por que nos interesa la exactitud de los pronosticos de riego? Irrigar un campo es caro. Si va a llover, puedo ahorrarme ese gasto.
ETL for forecasts:
- too many sources
- too many formats
- temporary data availability => tasks for collecting data
Un problema importante es como guardar los datos para nuevos experimentos y reproducibilidad. Lidiar con la perdida de datos.
TidyData: cada fila es la entrada de mi modelo.
Classification report de las 4 fuentes.
Query2Vec: learning to generate synonyms No parte de una ontologia. Doing it manually doesn't scale. Word2vec. Hypothesis: queries within a same session are related.
Learning to rank: Query2vec might even bring thousands of items. Which ones should go at the top? Models that sort items near and are fresh. A/B testing to find best linear combination. But it's hard to add factors and you can't model non-linear combinations.
Pointwise: ranking as calssification, regression or ordinal regression
Booking.com
Recommendation systems: Accommodations, Dates, Destinations, More
Un 20% de los 200+ modelos que se deplyaron en los ultimos 5 años son sistemas de recomendacion.
Sistemas de recomendacion + teoria de juegos
Lo principal es como se contrsuye un sistema de recomendacion.
-
Target item: Los recsys son complejos. que vamos a recomendar
-
Audience: A quien le estamos recomendando? Usuarios nuevos, usuarios expertos, usuarios de ultimo minuto?
-
Framing: Como enmarcamos las recomendaciones?
-
KPI: Que esperamos que sea genere el sistema de recomendacion? Mas click rate, mayor conversiones, upselling?
-
Data: Que data vamos a usar?
-
Feedback: como definimos la satisfaccion del cliente? Que es lo que nos dice que a un usuario le gusto lo que le recomendamos?
-
Sparsity: La mayoria de los usuarios viaja muy poco
-
Cold Start: en el caso de booking, es continuo
- usuarios
- hoteles
- tipos de politicas de cancelacion
- nuevos tipos de acomodacion
-
Latencia: ningun recomendador puede tardar mas de 10msecs
-
Availability: Llega un punto donde no puedo recomendar mas un hotel porque se quedo sin capacidad, a diferencia de un sistema que recomiende peliculas
-
Complejidad: los items se relacionan con otros
No hay correlacion entre la metrica comercial y la metrica offline * selection bias: modeks are trained using a non random sample of the population of interes * para confirmar, el usuario tiene que ir, quedarse y puntuar * Feedback loops: our recommender system changes the system * Contraints: hotels run out of rooms * Non stationality: Suddenly everyone goes to russia
Tendencia a usar modelos simples: se ven mejoras mayores. Por que? Los modelos simples son mas robustos frente a esos problemas que rompen los sistemas productivos.
Ordernar los items es fundamental, pero hay mucho mas para hacer. No quedarse solo en la perspectiva de la academia de ordenar en base a una loss function arbitraria sino en alguna aplicacion de negocio. Desde las trincheras, el desarrollo tiene que ser incremental, hay que laburar con la gente de UX, etc
booking.ai Modelar disponibilidad es muy complicado!